{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 特征工程入门与实践\n",
    "\n",
    "参考：https://github.com/PacktPublishing/Feature-Engineering-Made-Easy\n",
    "\n",
    "\n",
    "数据与书籍源代码可以从上述地址下载。\n",
    "\n",
    "数据放到 `../data/feature_engineering` 目录中，运行本 Notebook"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:34:28.871575Z",
     "start_time": "2019-11-20T08:34:28.862790Z"
    }
   },
   "outputs": [],
   "source": [
    "# import packages we need for exploratory data analysis (EDA)\n",
    "import pandas as pd  # to store tabular data\n",
    "import numpy as np  # to do some math\n",
    "import matplotlib.pyplot as plt  # a popular data visualization tool\n",
    "import seaborn as sns  # another popular data visualization tool\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "%matplotlib inline  \n",
    "plt.style.use('fivethirtyeight')  # a popular data visualization theme"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征增强：清洗数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### EDA， exploratory data analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:18:28.484896Z",
     "start_time": "2019-11-06T12:18:28.475877Z"
    }
   },
   "outputs": [],
   "source": [
    "# 使用匹马印第安人糖尿病预测数据集,其中 onset_diabetes 表示是否患病\n",
    "pima_column_names = ['times_pregnant', 'plasma_glucose_concentration', 'diastolic_blood_pressure', \n",
    "                     'triceps_thickness', 'serum_insulin', 'bmi', 'pedigree_function', 'age', \n",
    "                     'onset_diabetes']\n",
    "pima = pd.read_csv('../data/feature_engineering/pima.data', names=pima_column_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T03:53:18.995933Z",
     "start_time": "2019-11-06T03:53:18.984371Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>times_pregnant</th>\n",
       "      <th>plasma_glucose_concentration</th>\n",
       "      <th>diastolic_blood_pressure</th>\n",
       "      <th>triceps_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>bmi</th>\n",
       "      <th>pedigree_function</th>\n",
       "      <th>age</th>\n",
       "      <th>onset_diabetes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   times_pregnant  plasma_glucose_concentration  diastolic_blood_pressure  \\\n",
       "0               6                           148                        72   \n",
       "1               1                            85                        66   \n",
       "2               8                           183                        64   \n",
       "3               1                            89                        66   \n",
       "4               0                           137                        40   \n",
       "\n",
       "   triceps_thickness  serum_insulin   bmi  pedigree_function  age  \\\n",
       "0                 35              0  33.6              0.627   50   \n",
       "1                 29              0  26.6              0.351   31   \n",
       "2                  0              0  23.3              0.672   32   \n",
       "3                 23             94  28.1              0.167   21   \n",
       "4                 35            168  43.1              2.288   33   \n",
       "\n",
       "   onset_diabetes  \n",
       "0               1  \n",
       "1               0  \n",
       "2               1  \n",
       "3               0  \n",
       "4               1  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过直方图查看糖尿病人与正常人的区别。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T03:58:20.837205Z",
     "start_time": "2019-11-06T03:58:20.603828Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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tq1fZz2ygCVLltCv3+LOJ+6CWtxH22+/Pdtvv32PL/fHP/4xJ5xQ+cf1uaZlZlZBM2bMYKedduIb3/gGO++8MwcddBDNzc08+uij7LnnnowaNYrDDjuM+fPnA7Dffvtx2mmnsfvuuzNq1Cjuu+++ssudMmUKo0eP5qMf/SiXXHJJa/k999zDIYccAsBDDz3EXnvtxdixY9lrr73a/APwzJkzOfjgg9lxxx35wQ9+0Fp+9dVXs/vuuzNmzBiOO+443n77bSZOnEhzczNjxozhy1/+crvTvf322xx99NGMHDmSUaNGccEFF6z0/nPSMjOrsGeeeYYvfelL3H///QwePJgbbriBo446iokTJ3Lfffex9dZbt0kcS5Ys4fbbb+f000/n7LPPLrvMr371q5x99tn87W9/a3e9DQ0N/OUvf+Gee+7h29/+NqeffnrruIcffpiLL76Ye+65h+uvv55HHnmEp59+mkmTJnHzzTdz77330rdvX6655homTpzIgAEDuPfee7n44ovLTvenP/2Jxx57jFmzZjF58mTuu+8+DjvssJXed24eNDOrsE022YQPfvCDAGy33XY899xzLFiwgDFjxgDw2c9+lgkTJrROf8ABBwCw7bbb8vzzzy+3vKampjbzH3LIIdx6663LTbdgwQKOPvponn32WSTx1ltvtY4bN24cQ4cOBWD//fdn8uTJ9OvXj6lTp7LbbrsB8MYbb7Deeustt9y77rpruemGDBnCgQceyPTp0znxxBP52Mc+xu677979nVXCScvMrMLWXHPN1vd9+/bt9J9wW6bv06cPS5akZ4J+9atf5dFHH2X48OFcfPHFXVrvGWecwdixY7nyyiuZMWMG+++/f+u40n/ulURE8JnPfIbTTjutw+WWm+6NN95grbXW4t577+W2227j4osv5rrrrlvpJsKKNA9KulTSbEmPl5R/XdLTkp6Q9MNC+SmSpuVxH6tEjGZm1TJo0CAGDx7cer3qqquuYvTo0R3Oc+GFF3Lvvfdy7bXXMmTIEAYNGsTkyZMBuPbaa8vOs2DBAoYPHw7A73//+zbj7rzzTubNm0dzczN//vOf2Xnnndl11125/vrrefXVVwGYN29ea02vX79+rTW1ctO98MILzJkzh6VLlzJ+/HhOPfVUpk6duiK7p41K1bQuA34OXNFSIGk3YDzwwYh4Mz96G0lb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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plasma_glucose_concentration 列绘制直方图\n",
    "\n",
    "col = 'plasma_glucose_concentration'\n",
    "plt.hist(pima[pima['onset_diabetes'] == 0][col], bins=10, alpha=0.5, label='non-diabetes')\n",
    "plt.hist(pima[pima['onset_diabetes'] == 1][col], bins=10, alpha=0.5, label='diabetes')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel(col)\n",
    "plt.ylabel('Frequency')\n",
    "plt.title('Histogram of {}'.format(col))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T04:04:16.090714Z",
     "start_time": "2019-11-06T04:04:15.699647Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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tq1fZz2ygCVLltCv3+LOJ+6CWtxH22+/Pdtvv32PL/fHP/4xJ5xQ+cf1uaZlZlZBM2bMYKedduIb3/gGO++8MwcddBDNzc08+uij7LnnnowaNYrDDjuM+fPnA7Dffvtx2mmnsfvuuzNq1Cjuu+++ssudMmUKo0eP5qMf/SiXXHJJa/k999zDIYccAsBDDz3EXnvtxdixY9lrr73a/APwzJkzOfjgg9lxxx35wQ9+0Fp+9dVXs/vuuzNmzBiOO+443n77bSZOnEhzczNjxozhy1/+crvTvf322xx99NGMHDmSUaNGccEFF6z0/nPSMjOrsGeeeYYvfelL3H///QwePJgbbriBo446iokTJ3Lfffex9dZbt0kcS5Ys4fbbb+f000/n7LPPLrvMr371q5x99tn87W9/a3e9DQ0N/OUvf+Gee+7h29/+NqeffnrruIcffpiLL76Ye+65h+uvv55HHnmEp59+mkmTJnHzzTdz77330rdvX6655homTpzIgAEDuPfee7n44ovLTvenP/2Jxx57jFmzZjF58mTuu+8+DjvssJXed24eNDOrsE022YQPfvCDAGy33XY899xzLFiwgDFjxgDw2c9+lgkTJrROf8ABBwCw7bbb8vzzzy+3vKampjbzH3LIIdx6663LTbdgwQKOPvponn32WSTx1ltvtY4bN24cQ4cOBWD//fdn8uTJ9OvXj6lTp7LbbrsB8MYbb7Deeustt9y77rpruemGDBnCgQceyPTp0znxxBP52Mc+xu677979nVXCScvMrMLWXHPN1vd9+/bt9J9wW6bv06cPS5akZ4J+9atf5dFHH2X48OFcfPHFXVrvGWecwdixY7nyyiuZMWMG+++/f+u40n/ulURE8JnPfIbTTjutw+WWm+6NN95grbXW4t577+W2227j4osv5rrrrlvpJsKKNA9KulTSbEmPl5R/XdLTkp6Q9MNC+SmSpuVxH6tEjGZm1TJo0CAGDx7cer3qqquuYvTo0R3Oc+GFF3Lvvfdy7bXXMmTIEAYNGsTkyZMBuPbaa8vOs2DBAoYPHw7A73//+zbj7rzzTubNm0dzczN//vOf2Xnnndl11125/vrrefXVVwGYN29ea02vX79+rTW1ctO98MILzJkzh6VLlzJ+/HhOPfVUpk6duiK7p41K1bQuA34OXNFSIGk3YDzwwYh4Mz96G0lb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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for col in ['bmi', 'diastolic_blood_pressure', 'plasma_glucose_concentration']:\n",
    "    plt.hist(pima[pima['onset_diabetes']==0][col], 10, alpha=0.5, label='non-diabetes')\n",
    "    plt.hist(pima[pima['onset_diabetes']==1][col], 10, alpha=0.5, label='diabetes')\n",
    "    plt.legend(loc='upper right')\n",
    "    plt.xlabel(col)\n",
    "    plt.ylabel('Frequency')\n",
    "    plt.title('Histogram of {}'.format(col))\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出血浆葡萄糖浓度、舒张压等相差大，两类人有明显区别，接下来使用相关矩阵衡量变量关系，画热力图，从而看出哪些特征对患病的相关度高。\n",
    "\n",
    "理解皮尔逊相关系数：https://blog.csdn.net/huangfei711/article/details/78456165\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T04:05:48.449252Z",
     "start_time": "2019-11-06T04:05:48.441273Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "times_pregnant                  0.221898\n",
       "plasma_glucose_concentration    0.466581\n",
       "diastolic_blood_pressure        0.065068\n",
       "triceps_thickness               0.074752\n",
       "serum_insulin                   0.130548\n",
       "bmi                             0.292695\n",
       "pedigree_function               0.173844\n",
       "age                             0.238356\n",
       "onset_diabetes                  1.000000\n",
       "Name: onset_diabetes, dtype: float64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# plasma_glucose_concentration 的重要性很高\n",
    "pima.corr()['onset_diabetes']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T04:07:39.537453Z",
     "start_time": "2019-11-06T04:07:39.353947Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x22becca9438>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(pima.corr())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 识别与处理数据中的缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T04:16:16.419248Z",
     "start_time": "2019-11-06T04:16:16.412268Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "times_pregnant                  0\n",
       "plasma_glucose_concentration    0\n",
       "diastolic_blood_pressure        0\n",
       "triceps_thickness               0\n",
       "serum_insulin                   0\n",
       "bmi                             0\n",
       "pedigree_function               0\n",
       "age                             0\n",
       "onset_diabetes                  0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 以下代码看出没有缺失值\n",
    "pima.isnull().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "糖尿病发病率，空准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T04:17:16.836372Z",
     "start_time": "2019-11-06T04:17:16.828394Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.651042\n",
       "1    0.348958\n",
       "Name: onset_diabetes, dtype: float64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima['onset_diabetes'].value_counts(normalize=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T04:18:01.484997Z",
     "start_time": "2019-11-06T04:18:01.456073Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>times_pregnant</th>\n",
       "      <th>plasma_glucose_concentration</th>\n",
       "      <th>diastolic_blood_pressure</th>\n",
       "      <th>triceps_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>bmi</th>\n",
       "      <th>pedigree_function</th>\n",
       "      <th>age</th>\n",
       "      <th>onset_diabetes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       times_pregnant  plasma_glucose_concentration  diastolic_blood_pressure  \\\n",
       "count      768.000000                    768.000000                768.000000   \n",
       "mean         3.845052                    120.894531                 69.105469   \n",
       "std          3.369578                     31.972618                 19.355807   \n",
       "min          0.000000                      0.000000                  0.000000   \n",
       "25%          1.000000                     99.000000                 62.000000   \n",
       "50%          3.000000                    117.000000                 72.000000   \n",
       "75%          6.000000                    140.250000                 80.000000   \n",
       "max         17.000000                    199.000000                122.000000   \n",
       "\n",
       "       triceps_thickness  serum_insulin         bmi  pedigree_function  \\\n",
       "count         768.000000     768.000000  768.000000         768.000000   \n",
       "mean           20.536458      79.799479   31.992578           0.471876   \n",
       "std            15.952218     115.244002    7.884160           0.331329   \n",
       "min             0.000000       0.000000    0.000000           0.078000   \n",
       "25%             0.000000       0.000000   27.300000           0.243750   \n",
       "50%            23.000000      30.500000   32.000000           0.372500   \n",
       "75%            32.000000     127.250000   36.600000           0.626250   \n",
       "max            99.000000     846.000000   67.100000           2.420000   \n",
       "\n",
       "              age  onset_diabetes  \n",
       "count  768.000000      768.000000  \n",
       "mean    33.240885        0.348958  \n",
       "std     11.760232        0.476951  \n",
       "min     21.000000        0.000000  \n",
       "25%     24.000000        0.000000  \n",
       "50%     29.000000        0.000000  \n",
       "75%     41.000000        1.000000  \n",
       "max     81.000000        1.000000  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上面的统计中可以看到 plasma_glucose_concentration 为0，不符合实际，说明数据可能用 0 填充了缺失值。\n",
    "\n",
    "可以看出以下字段，本身不该有0，都用0填充了\n",
    "\n",
    "- plasma_glucose_concentration\n",
    "- diastolic_blood_pressure\n",
    "- triceps_thickness\n",
    "- serum_insulin\n",
    "- bmi\n",
    "\n",
    "缺失值的形式可能有：\n",
    "\n",
    "- 0\n",
    "- unkown\n",
    "- ?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 处理缺失值\n",
    "\n",
    "- 删除\n",
    "- 填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T06:45:01.298813Z",
     "start_time": "2019-11-06T06:45:01.287841Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima['serum_insulin'].isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T06:47:30.809148Z",
     "start_time": "2019-11-06T06:47:30.803164Z"
    }
   },
   "outputs": [],
   "source": [
    "# 手动将缺失值转为 None\n",
    "pima['serum_insulin'] = pima['serum_insulin'].map(lambda x:x if x != 0 else None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T06:47:37.402137Z",
     "start_time": "2019-11-06T06:47:37.398148Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "374"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima['serum_insulin'].isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T06:54:02.129173Z",
     "start_time": "2019-11-06T06:54:02.125184Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function replace in module pandas.core.frame:\n",
      "\n",
      "replace(self, to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')\n",
      "    Replace values given in `to_replace` with `value`.\n",
      "    \n",
      "    Values of the DataFrame are replaced with other values dynamically.\n",
      "    This differs from updating with ``.loc`` or ``.iloc``, which require\n",
      "    you to specify a location to update with some value.\n",
      "    \n",
      "    Parameters\n",
      "    ----------\n",
      "    to_replace : str, regex, list, dict, Series, int, float, or None\n",
      "        How to find the values that will be replaced.\n",
      "    \n",
      "        * numeric, str or regex:\n",
      "    \n",
      "            - numeric: numeric values equal to `to_replace` will be\n",
      "              replaced with `value`\n",
      "            - str: string exactly matching `to_replace` will be replaced\n",
      "              with `value`\n",
      "            - regex: regexs matching `to_replace` will be replaced with\n",
      "              `value`\n",
      "    \n",
      "        * list of str, regex, or numeric:\n",
      "    \n",
      "            - First, if `to_replace` and `value` are both lists, they\n",
      "              **must** be the same length.\n",
      "            - Second, if ``regex=True`` then all of the strings in **both**\n",
      "              lists will be interpreted as regexs otherwise they will match\n",
      "              directly. This doesn't matter much for `value` since there\n",
      "              are only a few possible substitution regexes you can use.\n",
      "            - str, regex and numeric rules apply as above.\n",
      "    \n",
      "        * dict:\n",
      "    \n",
      "            - Dicts can be used to specify different replacement values\n",
      "              for different existing values. For example,\n",
      "              ``{'a': 'b', 'y': 'z'}`` replaces the value 'a' with 'b' and\n",
      "              'y' with 'z'. To use a dict in this way the `value`\n",
      "              parameter should be `None`.\n",
      "            - For a DataFrame a dict can specify that different values\n",
      "              should be replaced in different columns. For example,\n",
      "              ``{'a': 1, 'b': 'z'}`` looks for the value 1 in column 'a'\n",
      "              and the value 'z' in column 'b' and replaces these values\n",
      "              with whatever is specified in `value`. The `value` parameter\n",
      "              should not be ``None`` in this case. You can treat this as a\n",
      "              special case of passing two lists except that you are\n",
      "              specifying the column to search in.\n",
      "            - For a DataFrame nested dictionaries, e.g.,\n",
      "              ``{'a': {'b': np.nan}}``, are read as follows: look in column\n",
      "              'a' for the value 'b' and replace it with NaN. The `value`\n",
      "              parameter should be ``None`` to use a nested dict in this\n",
      "              way. You can nest regular expressions as well. Note that\n",
      "              column names (the top-level dictionary keys in a nested\n",
      "              dictionary) **cannot** be regular expressions.\n",
      "    \n",
      "        * None:\n",
      "    \n",
      "            - This means that the `regex` argument must be a string,\n",
      "              compiled regular expression, or list, dict, ndarray or\n",
      "              Series of such elements. If `value` is also ``None`` then\n",
      "              this **must** be a nested dictionary or Series.\n",
      "    \n",
      "        See the examples section for examples of each of these.\n",
      "    value : scalar, dict, list, str, regex, default None\n",
      "        Value to replace any values matching `to_replace` with.\n",
      "        For a DataFrame a dict of values can be used to specify which\n",
      "        value to use for each column (columns not in the dict will not be\n",
      "        filled). Regular expressions, strings and lists or dicts of such\n",
      "        objects are also allowed.\n",
      "    inplace : bool, default False\n",
      "        If True, in place. Note: this will modify any\n",
      "        other views on this object (e.g. a column from a DataFrame).\n",
      "        Returns the caller if this is True.\n",
      "    limit : int, default None\n",
      "        Maximum size gap to forward or backward fill.\n",
      "    regex : bool or same types as `to_replace`, default False\n",
      "        Whether to interpret `to_replace` and/or `value` as regular\n",
      "        expressions. If this is ``True`` then `to_replace` *must* be a\n",
      "        string. Alternatively, this could be a regular expression or a\n",
      "        list, dict, or array of regular expressions in which case\n",
      "        `to_replace` must be ``None``.\n",
      "    method : {'pad', 'ffill', 'bfill', `None`}\n",
      "        The method to use when for replacement, when `to_replace` is a\n",
      "        scalar, list or tuple and `value` is ``None``.\n",
      "    \n",
      "        .. versionchanged:: 0.23.0\n",
      "            Added to DataFrame.\n",
      "    \n",
      "    Returns\n",
      "    -------\n",
      "    DataFrame\n",
      "        Object after replacement.\n",
      "    \n",
      "    Raises\n",
      "    ------\n",
      "    AssertionError\n",
      "        * If `regex` is not a ``bool`` and `to_replace` is not\n",
      "          ``None``.\n",
      "    TypeError\n",
      "        * If `to_replace` is a ``dict`` and `value` is not a ``list``,\n",
      "          ``dict``, ``ndarray``, or ``Series``\n",
      "        * If `to_replace` is ``None`` and `regex` is not compilable\n",
      "          into a regular expression or is a list, dict, ndarray, or\n",
      "          Series.\n",
      "        * When replacing multiple ``bool`` or ``datetime64`` objects and\n",
      "          the arguments to `to_replace` does not match the type of the\n",
      "          value being replaced\n",
      "    ValueError\n",
      "        * If a ``list`` or an ``ndarray`` is passed to `to_replace` and\n",
      "          `value` but they are not the same length.\n",
      "    \n",
      "    See Also\n",
      "    --------\n",
      "    DataFrame.fillna : Fill NA values.\n",
      "    DataFrame.where : Replace values based on boolean condition.\n",
      "    Series.str.replace : Simple string replacement.\n",
      "    \n",
      "    Notes\n",
      "    -----\n",
      "    * Regex substitution is performed under the hood with ``re.sub``. The\n",
      "      rules for substitution for ``re.sub`` are the same.\n",
      "    * Regular expressions will only substitute on strings, meaning you\n",
      "      cannot provide, for example, a regular expression matching floating\n",
      "      point numbers and expect the columns in your frame that have a\n",
      "      numeric dtype to be matched. However, if those floating point\n",
      "      numbers *are* strings, then you can do this.\n",
      "    * This method has *a lot* of options. You are encouraged to experiment\n",
      "      and play with this method to gain intuition about how it works.\n",
      "    * When dict is used as the `to_replace` value, it is like\n",
      "      key(s) in the dict are the to_replace part and\n",
      "      value(s) in the dict are the value parameter.\n",
      "    \n",
      "    Examples\n",
      "    --------\n",
      "    \n",
      "    **Scalar `to_replace` and `value`**\n",
      "    \n",
      "    >>> s = pd.Series([0, 1, 2, 3, 4])\n",
      "    >>> s.replace(0, 5)\n",
      "    0    5\n",
      "    1    1\n",
      "    2    2\n",
      "    3    3\n",
      "    4    4\n",
      "    dtype: int64\n",
      "    \n",
      "    >>> df = pd.DataFrame({'A': [0, 1, 2, 3, 4],\n",
      "    ...                    'B': [5, 6, 7, 8, 9],\n",
      "    ...                    'C': ['a', 'b', 'c', 'd', 'e']})\n",
      "    >>> df.replace(0, 5)\n",
      "       A  B  C\n",
      "    0  5  5  a\n",
      "    1  1  6  b\n",
      "    2  2  7  c\n",
      "    3  3  8  d\n",
      "    4  4  9  e\n",
      "    \n",
      "    **List-like `to_replace`**\n",
      "    \n",
      "    >>> df.replace([0, 1, 2, 3], 4)\n",
      "       A  B  C\n",
      "    0  4  5  a\n",
      "    1  4  6  b\n",
      "    2  4  7  c\n",
      "    3  4  8  d\n",
      "    4  4  9  e\n",
      "    \n",
      "    >>> df.replace([0, 1, 2, 3], [4, 3, 2, 1])\n",
      "       A  B  C\n",
      "    0  4  5  a\n",
      "    1  3  6  b\n",
      "    2  2  7  c\n",
      "    3  1  8  d\n",
      "    4  4  9  e\n",
      "    \n",
      "    >>> s.replace([1, 2], method='bfill')\n",
      "    0    0\n",
      "    1    3\n",
      "    2    3\n",
      "    3    3\n",
      "    4    4\n",
      "    dtype: int64\n",
      "    \n",
      "    **dict-like `to_replace`**\n",
      "    \n",
      "    >>> df.replace({0: 10, 1: 100})\n",
      "         A  B  C\n",
      "    0   10  5  a\n",
      "    1  100  6  b\n",
      "    2    2  7  c\n",
      "    3    3  8  d\n",
      "    4    4  9  e\n",
      "    \n",
      "    >>> df.replace({'A': 0, 'B': 5}, 100)\n",
      "         A    B  C\n",
      "    0  100  100  a\n",
      "    1    1    6  b\n",
      "    2    2    7  c\n",
      "    3    3    8  d\n",
      "    4    4    9  e\n",
      "    \n",
      "    >>> df.replace({'A': {0: 100, 4: 400}})\n",
      "         A  B  C\n",
      "    0  100  5  a\n",
      "    1    1  6  b\n",
      "    2    2  7  c\n",
      "    3    3  8  d\n",
      "    4  400  9  e\n",
      "    \n",
      "    **Regular expression `to_replace`**\n",
      "    \n",
      "    >>> df = pd.DataFrame({'A': ['bat', 'foo', 'bait'],\n",
      "    ...                    'B': ['abc', 'bar', 'xyz']})\n",
      "    >>> df.replace(to_replace=r'^ba.$', value='new', regex=True)\n",
      "          A    B\n",
      "    0   new  abc\n",
      "    1   foo  new\n",
      "    2  bait  xyz\n",
      "    \n",
      "    >>> df.replace({'A': r'^ba.$'}, {'A': 'new'}, regex=True)\n",
      "          A    B\n",
      "    0   new  abc\n",
      "    1   foo  bar\n",
      "    2  bait  xyz\n",
      "    \n",
      "    >>> df.replace(regex=r'^ba.$', value='new')\n",
      "          A    B\n",
      "    0   new  abc\n",
      "    1   foo  new\n",
      "    2  bait  xyz\n",
      "    \n",
      "    >>> df.replace(regex={r'^ba.$': 'new', 'foo': 'xyz'})\n",
      "          A    B\n",
      "    0   new  abc\n",
      "    1   xyz  new\n",
      "    2  bait  xyz\n",
      "    \n",
      "    >>> df.replace(regex=[r'^ba.$', 'foo'], value='new')\n",
      "          A    B\n",
      "    0   new  abc\n",
      "    1   new  new\n",
      "    2  bait  xyz\n",
      "    \n",
      "    Note that when replacing multiple ``bool`` or ``datetime64`` objects,\n",
      "    the data types in the `to_replace` parameter must match the data\n",
      "    type of the value being replaced:\n",
      "    \n",
      "    >>> df = pd.DataFrame({'A': [True, False, True],\n",
      "    ...                    'B': [False, True, False]})\n",
      "    >>> df.replace({'a string': 'new value', True: False})  # raises\n",
      "    Traceback (most recent call last):\n",
      "        ...\n",
      "    TypeError: Cannot compare types 'ndarray(dtype=bool)' and 'str'\n",
      "    \n",
      "    This raises a ``TypeError`` because one of the ``dict`` keys is not of\n",
      "    the correct type for replacement.\n",
      "    \n",
      "    Compare the behavior of ``s.replace({'a': None})`` and\n",
      "    ``s.replace('a', None)`` to understand the peculiarities\n",
      "    of the `to_replace` parameter:\n",
      "    \n",
      "    >>> s = pd.Series([10, 'a', 'a', 'b', 'a'])\n",
      "    \n",
      "    When one uses a dict as the `to_replace` value, it is like the\n",
      "    value(s) in the dict are equal to the `value` parameter.\n",
      "    ``s.replace({'a': None})`` is equivalent to\n",
      "    ``s.replace(to_replace={'a': None}, value=None, method=None)``:\n",
      "    \n",
      "    >>> s.replace({'a': None})\n",
      "    0      10\n",
      "    1    None\n",
      "    2    None\n",
      "    3       b\n",
      "    4    None\n",
      "    dtype: object\n",
      "    \n",
      "    When ``value=None`` and `to_replace` is a scalar, list or\n",
      "    tuple, `replace` uses the method parameter (default 'pad') to do the\n",
      "    replacement. So this is why the 'a' values are being replaced by 10\n",
      "    in rows 1 and 2 and 'b' in row 4 in this case.\n",
      "    The command ``s.replace('a', None)`` is actually equivalent to\n",
      "    ``s.replace(to_replace='a', value=None, method='pad')``:\n",
      "    \n",
      "    >>> s.replace('a', None)\n",
      "    0    10\n",
      "    1    10\n",
      "    2    10\n",
      "    3     b\n",
      "    4     b\n",
      "    dtype: object\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(pd.DataFrame.replace)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:18:52.085240Z",
     "start_time": "2019-11-06T12:18:52.077237Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "times_pregnant                    0\n",
       "plasma_glucose_concentration      5\n",
       "diastolic_blood_pressure         35\n",
       "triceps_thickness               227\n",
       "serum_insulin                   374\n",
       "bmi                              11\n",
       "pedigree_function                 0\n",
       "age                               0\n",
       "onset_diabetes                    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 批量转换\n",
    "columns = ['serum_insulin','bmi','plasma_glucose_concentration','diastolic_blood_pressure','triceps_thickness']\n",
    "\n",
    "for col in columns:\n",
    "    # 注意，这里替换需要用 [] 包裹，否则无法正确替换为 None.\n",
    "    # 直接写成 (0, None) ，0 依然是0，因为数据格式是 数值\n",
    "    pima[col].replace([0], [None], inplace=True)\n",
    "    \n",
    "pima.isnull().sum() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T06:59:51.075312Z",
     "start_time": "2019-11-06T06:59:51.057782Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>times_pregnant</th>\n",
       "      <th>pedigree_function</th>\n",
       "      <th>age</th>\n",
       "      <th>onset_diabetes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       times_pregnant  pedigree_function         age  onset_diabetes\n",
       "count      768.000000         768.000000  768.000000      768.000000\n",
       "mean         3.845052           0.471876   33.240885        0.348958\n",
       "std          3.369578           0.331329   11.760232        0.476951\n",
       "min          0.000000           0.078000   21.000000        0.000000\n",
       "25%          1.000000           0.243750   24.000000        0.000000\n",
       "50%          3.000000           0.372500   29.000000        0.000000\n",
       "75%          6.000000           0.626250   41.000000        1.000000\n",
       "max         17.000000           2.420000   81.000000        1.000000"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T06:59:51.974191Z",
     "start_time": "2019-11-06T06:59:51.965622Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>times_pregnant</th>\n",
       "      <th>plasma_glucose_concentration</th>\n",
       "      <th>diastolic_blood_pressure</th>\n",
       "      <th>triceps_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>bmi</th>\n",
       "      <th>pedigree_function</th>\n",
       "      <th>age</th>\n",
       "      <th>onset_diabetes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>None</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>None</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>None</td>\n",
       "      <td>None</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   times_pregnant plasma_glucose_concentration diastolic_blood_pressure  \\\n",
       "0               6                          148                       72   \n",
       "1               1                           85                       66   \n",
       "2               8                          183                       64   \n",
       "3               1                           89                       66   \n",
       "4               0                          137                       40   \n",
       "\n",
       "  triceps_thickness serum_insulin   bmi  pedigree_function  age  \\\n",
       "0                35          None  33.6              0.627   50   \n",
       "1                29          None  26.6              0.351   31   \n",
       "2              None          None  23.3              0.672   32   \n",
       "3                23            94  28.1              0.167   21   \n",
       "4                35           168  43.1              2.288   33   \n",
       "\n",
       "   onset_diabetes  \n",
       "0               1  \n",
       "1               0  \n",
       "2               1  \n",
       "3               0  \n",
       "4               1  "
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T06:59:53.969219Z",
     "start_time": "2019-11-06T06:59:53.962237Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "times_pregnant                  768 non-null int64\n",
      "plasma_glucose_concentration    763 non-null object\n",
      "diastolic_blood_pressure        733 non-null object\n",
      "triceps_thickness               541 non-null object\n",
      "serum_insulin                   394 non-null object\n",
      "bmi                             757 non-null object\n",
      "pedigree_function               768 non-null float64\n",
      "age                             768 non-null int64\n",
      "onset_diabetes                  768 non-null int64\n",
      "dtypes: float64(1), int64(3), object(5)\n",
      "memory usage: 54.1+ KB\n"
     ]
    }
   ],
   "source": [
    "pima.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:18:55.712040Z",
     "start_time": "2019-11-06T12:18:55.706057Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "75     None\n",
       "182    None\n",
       "342    None\n",
       "349    None\n",
       "502    None\n",
       "Name: plasma_glucose_concentration, dtype: object"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看plasma_glucose_concentration缺失值的内容\n",
    "empty_plasma_index = pima[pima['plasma_glucose_concentration'].isnull()].index\n",
    "pima.loc[empty_plasma_index]['plasma_glucose_concentration']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "填充缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T09:53:45.463190Z",
     "start_time": "2019-11-06T09:53:45.457206Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "retained 49% of rows\n"
     ]
    }
   ],
   "source": [
    "# 直接删除缺失行\n",
    "pima_dropped = pima.dropna()\n",
    "num_rows_lost = round(100 * (pima.shape[0] - pima_dropped.shape[0]) / pima.shape[0])\n",
    "print(\"retained {}% of rows\".format(num_rows_lost))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "删除数据前后类别比例相差不大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T09:49:54.531903Z",
     "start_time": "2019-11-06T09:49:54.522901Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.651042\n",
       "1    0.348958\n",
       "Name: onset_diabetes, dtype: float64"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima['onset_diabetes'].value_counts(normalize=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T09:50:23.799564Z",
     "start_time": "2019-11-06T09:50:23.794578Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.668367\n",
       "1    0.331633\n",
       "Name: onset_diabetes, dtype: float64"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima_dropped['onset_diabetes'].value_counts(normalize=True) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "查看下 删除行 之后，各个特征均值的差异\n",
    "\n",
    "**用变化比例来查看，不要用肉眼观察**\n",
    "\n",
    "可以看到变化幅度较大，其实最好的方法是尽可能保留多一些的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T09:54:09.215998Z",
     "start_time": "2019-11-06T09:54:09.058419Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, '% change')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "ax = (100*(pima_dropped.mean()-pima.mean())/pima.mean()).plot(kind='bar', title='% change in average column values')\n",
    "ax.set_ylabel('% change')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用删除缺失值后的数据进行模型学习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T09:58:21.530970Z",
     "start_time": "2019-11-06T09:58:20.667652Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "learning from 392 rows\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7448979591836735 {'n_neighbors': 7}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:841: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal.\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "# now lets do some machine learning\n",
    "\n",
    "# note we are using the dataset with the dropped rows\n",
    "\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "X_dropped = pima_dropped.drop('onset_diabetes', axis=1)\n",
    "# create our feature matrix by removing the response variable\n",
    "print(\"learning from {} rows\".format(X_dropped.shape[0]))\n",
    "y_dropped = pima_dropped['onset_diabetes']\n",
    "\n",
    "\n",
    "# our grid search variables and instances\n",
    "\n",
    "# KNN parameters to try\n",
    "knn_params = {'n_neighbors':[1, 2, 3, 4, 5, 6, 7]}\n",
    "\n",
    "knn = KNeighborsClassifier()\n",
    "grid = GridSearchCV(knn, knn_params)\n",
    "grid.fit(X_dropped, y_dropped)\n",
    "\n",
    "print(grid.best_score_, grid.best_params_)\n",
    "# but we are learning from way fewer rows.."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "缺失值填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:19:03.075188Z",
     "start_time": "2019-11-06T12:19:03.070202Z"
    }
   },
   "outputs": [],
   "source": [
    "# 填充平均值\n",
    "pima['plasma_glucose_concentration'].fillna(pima['plasma_glucose_concentration'].mean(), inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:17:42.873252Z",
     "start_time": "2019-11-06T12:17:42.865270Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "times_pregnant                    0\n",
       "plasma_glucose_concentration      0\n",
       "diastolic_blood_pressure         35\n",
       "triceps_thickness               227\n",
       "serum_insulin                   374\n",
       "bmi                              11\n",
       "pedigree_function                 0\n",
       "age                               0\n",
       "onset_diabetes                    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:19:04.828418Z",
     "start_time": "2019-11-06T12:19:04.823391Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "75     121.686763\n",
       "182    121.686763\n",
       "342    121.686763\n",
       "349    121.686763\n",
       "502    121.686763\n",
       "Name: plasma_glucose_concentration, dtype: float64"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pima.loc[empty_plasma_index]['plasma_glucose_concentration']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "需要在划分训练集和测试集之后进行填充，因为我们需要用训练数据结果应用到测试集中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:36:12.091197Z",
     "start_time": "2019-11-06T12:36:12.087208Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import Imputer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:29:34.229971Z",
     "start_time": "2019-11-06T12:29:34.222789Z"
    }
   },
   "outputs": [],
   "source": [
    "X = pima.drop('onset_diabetes', axis=1).copy()\n",
    "y = pima['onset_diabetes'].copy()\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=99)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:29:34.970045Z",
     "start_time": "2019-11-06T12:29:34.959071Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "times_pregnant                    3.805556\n",
      "plasma_glucose_concentration    122.100799\n",
      "diastolic_blood_pressure         72.829137\n",
      "triceps_thickness                29.203883\n",
      "serum_insulin                   158.546053\n",
      "bmi                              32.455245\n",
      "pedigree_function                 0.479524\n",
      "age                              33.248264\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "data_set_mean = X_train.mean()\n",
    "X_train = X_train.fillna(data_set_mean)\n",
    "X_test = X_test.fillna(data_set_mean)\n",
    "print(data_set_mean)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:29:37.029036Z",
     "start_time": "2019-11-06T12:29:37.017068Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.734375"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn = KNeighborsClassifier()\n",
    "knn.fit(X_train, y_train)\n",
    "knn.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在机器学习流水线 Pipeline 中填充缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T13:06:52.637689Z",
     "start_time": "2019-11-06T13:06:52.263711Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.71875 {'classify__n_neighbors': 5}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "knn_params = {'classify__n_neighbors': [1,2,3,4,5,6,7]}\n",
    "\n",
    "knn = KNeighborsClassifier()\n",
    "\n",
    "mean_inpute = Pipeline([('imputer', Imputer(strategy='mean')), \n",
    "                        ('classify', knn)\n",
    "                       ])\n",
    "\n",
    "grid = GridSearchCV(mean_inpute, knn_params)\n",
    "grid.fit(X_train, y_train)\n",
    "\n",
    "print(grid.best_score_, grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:39:45.458290Z",
     "start_time": "2019-11-06T12:39:45.455267Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.71875 {'classify__n_neighbors': 5}\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_score_, grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:40:37.328008Z",
     "start_time": "2019-11-06T12:40:37.317038Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.734375"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid.score(X_test,y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 标准化与归一化\n",
    "\n",
    "- Z-score\n",
    "- min-max\n",
    "- 行归一化\n",
    "\n",
    "特征尺度不一致需要标准化，以下算法会受尺度影响\n",
    "\n",
    "- KNN，依赖距离\n",
    "- K-meas\n",
    "- 逻辑回归，支持向量机，神经网络等如果使用梯度下降来学习权重；\n",
    "- 主成分分析，特征向量偏向于较大的列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:42:24.722382Z",
     "start_time": "2019-11-06T12:42:24.713405Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "impute = Imputer(strategy='mean')\n",
    "pima_imputed_mean = pd.DataFrame(impute.fit_transform(pima), columns=pima_column_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:42:50.370365Z",
     "start_time": "2019-11-06T12:42:49.311618Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[<matplotlib.axes._subplots.AxesSubplot object at 0x00000204F5A94710>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F5474048>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F54F5978>],\n",
       "       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000204F5AB4E80>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F48C7C18>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F53172E8>],\n",
       "       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000204F55DC940>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F5DEEFD0>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F567A048>]],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x1080 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pima_imputed_mean.hist(figsize=(15,15))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的图看出数据分布（最小、最大值、标准差差别大），特征尺度不一致。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:46:58.235121Z",
     "start_time": "2019-11-06T12:46:57.028864Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[<matplotlib.axes._subplots.AxesSubplot object at 0x00000204F55AE668>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F50367F0>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F545EDA0>],\n",
       "       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000204F61B6630>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F61F5E80>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F5ACC978>],\n",
       "       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000204EF50E390>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F5AB2C88>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F5AB2EB8>]],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x1080 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pima_imputed_mean.hist(figsize=(15, 15), sharex=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "z-score 标准化 \n",
    "\n",
    "$$z=(x-\\mu)/\\sigma$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:54:58.630001Z",
     "start_time": "2019-11-06T12:54:58.626012Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import Normalizer, StandardScaler, MinMaxScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:55:15.412627Z",
     "start_time": "2019-11-06T12:55:15.407670Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(121.68676277850587, 30.43594886720766)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 标准化前的均值和方差\n",
    "pima['plasma_glucose_concentration'].mean(), pima['plasma_glucose_concentration'].std()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:55:36.772416Z",
     "start_time": "2019-11-06T12:55:36.640327Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Distribution of plasma_glucose_concentration')"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = pima['plasma_glucose_concentration'].hist()\n",
    "ax.set_title('Distribution of plasma_glucose_concentration')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T12:56:28.572360Z",
     "start_time": "2019-11-06T12:56:28.565378Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-3.561965537339044e-16, 1.0)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "glucose_z_score_standardized = StandardScaler().fit_transform(pima[['plasma_glucose_concentration']])\n",
    "glucose_z_score_standardized.mean(), glucose_z_score_standardized.std()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T13:05:05.603032Z",
     "start_time": "2019-11-06T13:05:05.484321Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Distribution of plasma_glucose_concentration after Z Score Scaling')"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = pd.Series(glucose_z_score_standardized.reshape(-1)).hist()\n",
    "ax.set_title('Distribution of plasma_glucose_concentration after Z Score Scaling')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T13:06:01.273208Z",
     "start_time": "2019-11-06T13:06:00.297191Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[<matplotlib.axes._subplots.AxesSubplot object at 0x00000204F63A3390>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F6658CC0>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F6601208>],\n",
       "       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000204F64AE710>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F64D8C18>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F65D2160>],\n",
       "       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000204F64FF668>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F6527BA8>,\n",
       "        <matplotlib.axes._subplots.AxesSubplot object at 0x00000204F6527BE0>]],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x1080 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "scale = StandardScaler()  # instantiate a z-scaler object\n",
    "\n",
    "pima_imputed_mean_scaled = pd.DataFrame(scale.fit_transform(pima_imputed_mean), columns=pima_column_names)\n",
    "\n",
    "pima_imputed_mean_scaled.hist(figsize=(15, 15), sharex=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T13:08:38.576502Z",
     "start_time": "2019-11-06T13:08:37.788602Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv='warn', error_score='raise-deprecating',\n",
       "       estimator=Pipeline(memory=None,\n",
       "     steps=[('imputer', Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)), ('standardize', StandardScaler(copy=True, with_mean=True, with_std=True)), ('classify', KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n",
       "           weights='uniform'))]),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'imputer__strategy': ['mean', 'median'], 'classify__n_neighbors': [1, 2, 3, 4, 5, 6, 7]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_params = {'imputer__strategy':['mean', 'median'], 'classify__n_neighbors': [1,2,3,4,5,6,7]}\n",
    "\n",
    "knn = KNeighborsClassifier()\n",
    "\n",
    "mean_inpute = Pipeline([('imputer', Imputer(strategy='mean')), \n",
    "                        ('standardize', StandardScaler()),\n",
    "                        ('classify', knn)\n",
    "                       ])\n",
    "\n",
    "grid = GridSearchCV(mean_inpute, knn_params)\n",
    "grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T13:08:40.044543Z",
     "start_time": "2019-11-06T13:08:40.034540Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7569444444444444 {'classify__n_neighbors': 7, 'imputer__strategy': 'mean'}\n",
      "0.7604166666666666\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_score_, grid.best_params_)\n",
    "print(grid.score(X_test, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Min-Max 标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T13:15:53.475067Z",
     "start_time": "2019-11-06T13:15:52.688405Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv='warn', error_score='raise-deprecating',\n",
       "       estimator=Pipeline(memory=None,\n",
       "     steps=[('imputer', Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)), ('standardize', MinMaxScaler(copy=True, feature_range=(0, 1))), ('classify', KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n",
       "           weights='uniform'))]),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'imputer__strategy': ['mean', 'median'], 'classify__n_neighbors': [1, 2, 3, 4, 5, 6, 7]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_params = {'imputer__strategy':['mean', 'median'], 'classify__n_neighbors': [1,2,3,4,5,6,7]}\n",
    "\n",
    "knn = KNeighborsClassifier()\n",
    "\n",
    "mean_inpute = Pipeline([('imputer', Imputer(strategy='mean')), \n",
    "                        ('standardize', MinMaxScaler()),\n",
    "                        ('classify', knn)\n",
    "                       ])\n",
    "\n",
    "grid = GridSearchCV(mean_inpute, knn_params)\n",
    "grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T13:15:56.473240Z",
     "start_time": "2019-11-06T13:15:56.462269Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7517361111111112 {'classify__n_neighbors': 7, 'imputer__strategy': 'mean'}\n",
      "0.7760416666666666\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_score_, grid.best_params_)\n",
    "print(grid.score(X_test, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "行归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-06T13:22:48.052974Z",
     "start_time": "2019-11-06T13:22:48.037974Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "normalize = Normalizer()\n",
    "\n",
    "pima_normalized = pd.DataFrame(normalize.fit_transform(pima.fillna(pima.mean())), columns=pima_column_names)\n",
    "# 查看矩阵的平均范数\n",
    "np.sqrt((pima_normalized**2).sum(axis=1)).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_params = {'imputer__strategy':['mean', 'median'], 'classify__n_neighbors': [1,2,3,4,5,6,7]}\n",
    "\n",
    "knn = KNeighborsClassifier()\n",
    "\n",
    "mean_inpute = Pipeline([('imputer', Imputer(strategy='mean')), \n",
    "                        ('standardize', Normalizer()),\n",
    "                        ('classify', knn)\n",
    "                       ])\n",
    "\n",
    "grid = GridSearchCV(mean_inpute, knn_params)\n",
    "grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征构造"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:21:51.837065Z",
     "start_time": "2019-11-12T09:21:51.827117Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>city</th>\n",
       "      <th>boolean</th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>None</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>london</td>\n",
       "      <td>None</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>-0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>seattle</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>san francisco</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>dislike</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            city boolean ordinal_column  quantitative_column\n",
       "0          tokyo     yes  somewhat like                  1.0\n",
       "1           None      no           like                 11.0\n",
       "2         london    None  somewhat like                 -0.5\n",
       "3        seattle      no           like                 10.0\n",
       "4  san francisco      no  somewhat like                  NaN\n",
       "5          tokyo     yes        dislike                 20.0"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 手动构造一个数据\n",
    "X = pd.DataFrame({'city': ['tokyo', None,'london', 'seattle', 'san francisco', 'tokyo'],\n",
    "                 'boolean': ['yes', 'no', None, 'no', 'no', 'yes'], \n",
    "                  'ordinal_column':['somewhat like', 'like', 'somewhat like', 'like', 'somewhat like', 'dislike'], \n",
    "                  'quantitative_column':[1, 11, -.5, 10, None, 20]})\n",
    "X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分类变量填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:21:56.432548Z",
     "start_time": "2019-11-12T09:21:56.428531Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "city                   1\n",
       "boolean                1\n",
       "ordinal_column         0\n",
       "quantitative_column    1\n",
       "dtype: int64"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.isnull().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用出现频次最高的类别填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:22:10.992879Z",
     "start_time": "2019-11-12T09:22:10.987923Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'tokyo'"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X['city'].value_counts().index[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:22:13.764436Z",
     "start_time": "2019-11-12T09:22:13.757453Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0            tokyo\n",
       "1            tokyo\n",
       "2           london\n",
       "3          seattle\n",
       "4    san francisco\n",
       "5            tokyo\n",
       "Name: city, dtype: object"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X['city'].fillna(X['city'].value_counts().index[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 多列操作\n",
    "df = df.apply(lambda x : x.fillna(x.value_counts().index[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:40:54.310234Z",
     "start_time": "2019-11-12T09:40:54.306246Z"
    }
   },
   "outputs": [],
   "source": [
    "# 自定义分类填充器\n",
    "from sklearn.base import TransformerMixin\n",
    "\n",
    "class CustomCategoryImputer(TransformerMixin):\n",
    "    def __init__(self, cols=None):\n",
    "        self.cols = cols\n",
    "        \n",
    "    def transform(self, df):\n",
    "        X = df.copy()\n",
    "        for col in self.cols:\n",
    "            X[col].fillna(X[col].value_counts().index[0], inplace=True)\n",
    "        return X\n",
    "    \n",
    "    def fit(self, *_):\n",
    "        return self"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:40:55.154471Z",
     "start_time": "2019-11-12T09:40:55.152447Z"
    }
   },
   "outputs": [],
   "source": [
    "cci = CustomCategoryImputer(cols=['city', 'boolean'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:40:55.973441Z",
     "start_time": "2019-11-12T09:40:55.964472Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>city</th>\n",
       "      <th>boolean</th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>london</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>-0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>seattle</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>san francisco</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>dislike</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            city boolean ordinal_column  quantitative_column\n",
       "0          tokyo     yes  somewhat like                  1.0\n",
       "1          tokyo      no           like                 11.0\n",
       "2         london      no  somewhat like                 -0.5\n",
       "3        seattle      no           like                 10.0\n",
       "4  san francisco      no  somewhat like                  NaN\n",
       "5          tokyo     yes        dislike                 20.0"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cci.fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:46:06.008815Z",
     "start_time": "2019-11-12T09:46:06.003800Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import Imputer\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "# 自定义填充器，填充定量列\n",
    "class  CustomQuantitativeImputer(TransformerMixin):\n",
    "    def __init__(self, cols=None, strategy='mean'):\n",
    "        self.cols = cols\n",
    "        self.strategy = strategy\n",
    "        \n",
    "    def transform(self, df):\n",
    "        X = df.copy()\n",
    "        impute = Imputer(strategy=self.strategy)\n",
    "        for col in self.cols:\n",
    "            X[col] = impute.fit_transform(X[[col]])\n",
    "        return X\n",
    "    \n",
    "    def fit(self, *_):\n",
    "        return self"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:46:06.313643Z",
     "start_time": "2019-11-12T09:46:06.280703Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>city</th>\n",
       "      <th>boolean</th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>None</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>london</td>\n",
       "      <td>None</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>-0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>seattle</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>san francisco</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>8.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>dislike</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            city boolean ordinal_column  quantitative_column\n",
       "0          tokyo     yes  somewhat like                  1.0\n",
       "1           None      no           like                 11.0\n",
       "2         london    None  somewhat like                 -0.5\n",
       "3        seattle      no           like                 10.0\n",
       "4  san francisco      no  somewhat like                  8.3\n",
       "5          tokyo     yes        dislike                 20.0"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cqi = CustomQuantitativeImputer(cols=['quantitative_column'], strategy='mean')\n",
    "cqi.fit_transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T09:46:45.034863Z",
     "start_time": "2019-11-12T09:46:45.030845Z"
    }
   },
   "source": [
    "使用 Pipline 填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:00:00.770180Z",
     "start_time": "2019-11-12T10:00:00.762201Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "imputer = Pipeline([('quant', cqi), ('category', cci)])\n",
    "X = imputer.fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:00:08.749778Z",
     "start_time": "2019-11-12T10:00:08.742796Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>city</th>\n",
       "      <th>boolean</th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>london</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>-0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>seattle</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>san francisco</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>8.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>dislike</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            city boolean ordinal_column  quantitative_column\n",
       "0          tokyo     yes  somewhat like                  1.0\n",
       "1          tokyo      no           like                 11.0\n",
       "2         london      no  somewhat like                 -0.5\n",
       "3        seattle      no           like                 10.0\n",
       "4  san francisco      no  somewhat like                  8.3\n",
       "5          tokyo     yes        dislike                 20.0"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 编码分类变量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 定类等级编码\n",
    "\n",
    "onehot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:00:50.441151Z",
     "start_time": "2019-11-12T10:00:50.159055Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "      <th>city__london</th>\n",
       "      <th>city__san francisco</th>\n",
       "      <th>city__seattle</th>\n",
       "      <th>city__tokyo</th>\n",
       "      <th>boolean__no</th>\n",
       "      <th>boolean__yes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>somewhat like</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>like</td>\n",
       "      <td>11.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>somewhat like</td>\n",
       "      <td>-0.5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>like</td>\n",
       "      <td>10.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>somewhat like</td>\n",
       "      <td>8.3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>dislike</td>\n",
       "      <td>20.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  ordinal_column  quantitative_column  city__london  city__san francisco  \\\n",
       "0  somewhat like                  1.0             0                    0   \n",
       "1           like                 11.0             0                    0   \n",
       "2  somewhat like                 -0.5             1                    0   \n",
       "3           like                 10.0             0                    0   \n",
       "4  somewhat like                  8.3             0                    1   \n",
       "5        dislike                 20.0             0                    0   \n",
       "\n",
       "   city__seattle  city__tokyo  boolean__no  boolean__yes  \n",
       "0              0            1            0             1  \n",
       "1              0            1            1             0  \n",
       "2              0            0            1             0  \n",
       "3              1            0            1             0  \n",
       "4              0            0            1             0  \n",
       "5              0            1            0             1  "
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.get_dummies(X, columns=['city','boolean'], prefix_sep='__')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:04:09.393569Z",
     "start_time": "2019-11-12T10:04:09.389580Z"
    }
   },
   "outputs": [],
   "source": [
    "# 自定义填充器\n",
    "\n",
    "class CustomDummifier(TransformerMixin):\n",
    "    def __init__(self, cols=None):\n",
    "        self.cols = cols\n",
    "    \n",
    "    def transform(self, X):\n",
    "        return pd.get_dummies(X, columns=self.cols)\n",
    "    \n",
    "    def fit(self, *_):\n",
    "        return self"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:04:09.709856Z",
     "start_time": "2019-11-12T10:04:09.687943Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "      <th>boolean_no</th>\n",
       "      <th>boolean_yes</th>\n",
       "      <th>city_london</th>\n",
       "      <th>city_san francisco</th>\n",
       "      <th>city_seattle</th>\n",
       "      <th>city_tokyo</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>somewhat like</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>like</td>\n",
       "      <td>11.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>somewhat like</td>\n",
       "      <td>-0.5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>like</td>\n",
       "      <td>10.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>somewhat like</td>\n",
       "      <td>8.3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>dislike</td>\n",
       "      <td>20.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  ordinal_column  quantitative_column  boolean_no  boolean_yes  city_london  \\\n",
       "0  somewhat like                  1.0           0            1            0   \n",
       "1           like                 11.0           1            0            0   \n",
       "2  somewhat like                 -0.5           1            0            1   \n",
       "3           like                 10.0           1            0            0   \n",
       "4  somewhat like                  8.3           1            0            0   \n",
       "5        dislike                 20.0           0            1            0   \n",
       "\n",
       "   city_san francisco  city_seattle  city_tokyo  \n",
       "0                   0             0           1  \n",
       "1                   0             0           1  \n",
       "2                   0             0           0  \n",
       "3                   0             1           0  \n",
       "4                   1             0           0  \n",
       "5                   0             0           1  "
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cd = CustomDummifier(cols=['boolean', 'city'])\n",
    " \n",
    "cd.fit_transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 定序等级编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:05:42.283636Z",
     "start_time": "2019-11-12T10:05:42.278649Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    somewhat like\n",
      "1             like\n",
      "2    somewhat like\n",
      "3             like\n",
      "4    somewhat like\n",
      "5          dislike\n",
      "Name: ordinal_column, dtype: object\n",
      "0    1\n",
      "1    2\n",
      "2    1\n",
      "3    2\n",
      "4    1\n",
      "5    0\n",
      "Name: ordinal_column, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "ordering = ['dislike', 'somewhat like', 'like']\n",
    "\n",
    "print(X['ordinal_column'])\n",
    "\n",
    "print(X['ordinal_column'].map(lambda x: ordering.index(x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:09:13.427016Z",
     "start_time": "2019-11-12T10:09:13.422030Z"
    }
   },
   "outputs": [],
   "source": [
    "# 自定义填充器\n",
    "\n",
    "class CustomEncoder(TransformerMixin):\n",
    "    def __init__(self, col, ordering=None):\n",
    "        self.col = col\n",
    "        self.ordering = ordering\n",
    "        \n",
    "    def transform(self, df):\n",
    "        df = df.copy()\n",
    "        df[self.col]  = X[self.col].map(lambda x: self.ordering.index(x))\n",
    "        return df\n",
    "    \n",
    "    def fit(self, *_):\n",
    "        return self"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:09:13.710910Z",
     "start_time": "2019-11-12T10:09:13.702931Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>city</th>\n",
       "      <th>boolean</th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>london</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>seattle</td>\n",
       "      <td>no</td>\n",
       "      <td>2</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>san francisco</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "      <td>8.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>0</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            city boolean  ordinal_column  quantitative_column\n",
       "0          tokyo     yes               1                  1.0\n",
       "1          tokyo      no               2                 11.0\n",
       "2         london      no               1                 -0.5\n",
       "3        seattle      no               2                 10.0\n",
       "4  san francisco      no               1                  8.3\n",
       "5          tokyo     yes               0                 20.0"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ce = CustomEncoder(col='ordinal_column', ordering = ['dislike', 'somewhat like', 'like'])\n",
    "\n",
    "ce.fit_transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 连续特征分箱"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:10:55.657847Z",
     "start_time": "2019-11-12T10:10:54.461836Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     (-0.52, 6.333]\n",
       "1    (6.333, 13.167]\n",
       "2     (-0.52, 6.333]\n",
       "3    (6.333, 13.167]\n",
       "4    (6.333, 13.167]\n",
       "5     (13.167, 20.0]\n",
       "Name: quantitative_column, dtype: category\n",
       "Categories (3, interval[float64]): [(-0.52, 6.333] < (6.333, 13.167] < (13.167, 20.0]]"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.cut(X['quantitative_column'], bins=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:11:32.873699Z",
     "start_time": "2019-11-12T10:11:32.867716Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0\n",
       "1    1\n",
       "2    0\n",
       "3    1\n",
       "4    1\n",
       "5    2\n",
       "Name: quantitative_column, dtype: int64"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 设定参数编码\n",
    "pd.cut(X['quantitative_column'], bins=3, labels=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:13:20.640170Z",
     "start_time": "2019-11-12T10:13:20.630197Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     Low\n",
       "1    Okay\n",
       "2     Low\n",
       "3    Okay\n",
       "4    Okay\n",
       "5    Good\n",
       "Name: quantitative_column, dtype: category\n",
       "Categories (3, object): [Low < Okay < Good]"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用预定义标签\n",
    "group_names = ['Low', 'Okay', 'Good']\n",
    "pd.cut(X['quantitative_column'], bins=3, labels=group_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:13:43.803163Z",
     "start_time": "2019-11-12T10:13:43.798140Z"
    }
   },
   "outputs": [],
   "source": [
    "# 自定义填充器\n",
    "\n",
    "from sklearn.base import TransformerMixin\n",
    "\n",
    "class CustomCutter(TransformerMixin):\n",
    "    def __init__(self, col, bins, labels=False):\n",
    "        self.labels = labels\n",
    "        self.bins = bins\n",
    "        self.col = col\n",
    "        \n",
    "    def transform(self, df):\n",
    "        X = df.copy()\n",
    "        X[self.col] = pd.cut(X[self.col], bins=self.bins, labels=self.labels)\n",
    "        return X\n",
    "    \n",
    "    def fit(self, *_):\n",
    "        return self"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:13:50.715361Z",
     "start_time": "2019-11-12T10:13:50.707415Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>city</th>\n",
       "      <th>boolean</th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>london</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>seattle</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>san francisco</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>dislike</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            city boolean ordinal_column  quantitative_column\n",
       "0          tokyo     yes  somewhat like                    0\n",
       "1          tokyo      no           like                    1\n",
       "2         london      no  somewhat like                    0\n",
       "3        seattle      no           like                    1\n",
       "4  san francisco      no  somewhat like                    1\n",
       "5          tokyo     yes        dislike                    2"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cc = CustomCutter(col='quantitative_column', bins=3)\n",
    "\n",
    "cc.fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:15:41.591309Z",
     "start_time": "2019-11-12T10:15:41.587290Z"
    }
   },
   "outputs": [],
   "source": [
    "# 使用 Pipeline 填充\n",
    "# imputer 为上面定义过的 imputer\n",
    "pipe = Pipeline([('inputer',imputer),('dummify', cd), ('encode', ce), ('cut', cc)])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:15:59.981793Z",
     "start_time": "2019-11-12T10:15:59.974824Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>city</th>\n",
       "      <th>boolean</th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>11.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>london</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>-0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>seattle</td>\n",
       "      <td>no</td>\n",
       "      <td>like</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>san francisco</td>\n",
       "      <td>no</td>\n",
       "      <td>somewhat like</td>\n",
       "      <td>8.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tokyo</td>\n",
       "      <td>yes</td>\n",
       "      <td>dislike</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            city boolean ordinal_column  quantitative_column\n",
       "0          tokyo     yes  somewhat like                  1.0\n",
       "1          tokyo      no           like                 11.0\n",
       "2         london      no  somewhat like                 -0.5\n",
       "3        seattle      no           like                 10.0\n",
       "4  san francisco      no  somewhat like                  8.3\n",
       "5          tokyo     yes        dislike                 20.0"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:16:25.479045Z",
     "start_time": "2019-11-12T10:16:25.396267Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Pipeline(memory=None,\n",
       "     steps=[('inputer', Pipeline(memory=None,\n",
       "     steps=[('quant', <__main__.CustomQuantitativeImputer object at 0x00000204F854CB00>), ('category', <__main__.CustomCategoryImputer object at 0x00000204F805D710>)])), ('dummify', <__main__.CustomDummifier object at 0x00000204F8A08748>), ('encode', <__main__.CustomEncoder object at 0x00000204F8CF0F28>), ('cut', <__main__.CustomCutter object at 0x00000204F8B234A8>)])"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pipe.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-12T10:16:35.838035Z",
     "start_time": "2019-11-12T10:16:35.821081Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ordinal_column</th>\n",
       "      <th>quantitative_column</th>\n",
       "      <th>boolean_no</th>\n",
       "      <th>boolean_yes</th>\n",
       "      <th>city_london</th>\n",
       "      <th>city_san francisco</th>\n",
       "      <th>city_seattle</th>\n",
       "      <th>city_tokyo</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ordinal_column  quantitative_column  boolean_no  boolean_yes  city_london  \\\n",
       "0               1                    0           0            1            0   \n",
       "1               2                    1           1            0            0   \n",
       "2               1                    0           1            0            1   \n",
       "3               2                    1           1            0            0   \n",
       "4               1                    1           1            0            0   \n",
       "5               0                    2           0            1            0   \n",
       "\n",
       "   city_san francisco  city_seattle  city_tokyo  \n",
       "0                   0             0           1  \n",
       "1                   0             0           1  \n",
       "2                   0             0           0  \n",
       "3                   0             1           0  \n",
       "4                   1             0           0  \n",
       "5                   0             0           1  "
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pipe.transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 特征交叉，多项式特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T07:05:45.135763Z",
     "start_time": "2019-11-13T07:05:44.997984Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "      <th>z</th>\n",
       "      <th>activity</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1502</td>\n",
       "      <td>2215</td>\n",
       "      <td>2153</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1667</td>\n",
       "      <td>2072</td>\n",
       "      <td>2047</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1611</td>\n",
       "      <td>1957</td>\n",
       "      <td>1906</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.0</td>\n",
       "      <td>1601</td>\n",
       "      <td>1939</td>\n",
       "      <td>1831</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4.0</td>\n",
       "      <td>1643</td>\n",
       "      <td>1965</td>\n",
       "      <td>1879</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   index     x     y     z  activity\n",
       "0    0.0  1502  2215  2153         1\n",
       "1    1.0  1667  2072  2047         1\n",
       "2    2.0  1611  1957  1906         1\n",
       "3    3.0  1601  1939  1831         1\n",
       "4    4.0  1643  1965  1879         1"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 人体胸部加速度数据集,标签activity的数值为1-7\n",
    "'''\n",
    "1-在电脑前工作\n",
    "2-站立、走路和上下楼梯\n",
    "3-站立\n",
    "4-走路\n",
    "5-上下楼梯\n",
    "6-与人边走边聊\n",
    "7-站立着说话\n",
    "\n",
    "'''\n",
    "\n",
    "df = pd.read_csv('../data/feature_engineering/activity_recognizer/1.csv', header=None)\n",
    "df.columns = ['index', 'x', 'y', 'z', 'activity']\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T07:05:52.803933Z",
     "start_time": "2019-11-13T07:05:52.799943Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(162501, 5)"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T07:06:51.628179Z",
     "start_time": "2019-11-13T07:06:51.619203Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7    0.515369\n",
       "1    0.207242\n",
       "4    0.165291\n",
       "3    0.068793\n",
       "5    0.019637\n",
       "6    0.017951\n",
       "2    0.005711\n",
       "0    0.000006\n",
       "Name: activity, dtype: float64"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 空准确率, 最大值 0.5153\n",
    "df['activity'].value_counts(normalize=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T07:10:56.653043Z",
     "start_time": "2019-11-13T07:10:14.888784Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:652: Warning: The least populated class in y has only 1 members, which is too few. The minimum number of members in any class cannot be less than n_splits=3.\n",
      "  % (min_groups, self.n_splits)), Warning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.720752487676999 {'n_neighbors': 5}\n"
     ]
    }
   ],
   "source": [
    "# 直接训练看一看结果\n",
    "\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "X = df[['x', 'y', 'z']]\n",
    "y = df['activity']\n",
    "\n",
    "knn_params = {'n_neighbors': [3, 4, 5, 6 ]}\n",
    "\n",
    "knn = KNeighborsClassifier()\n",
    "grid = GridSearchCV(estimator=knn, param_grid=knn_params)\n",
    "\n",
    "grid.fit(X, y)\n",
    "\n",
    "print(grid.best_score_, grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T07:12:48.482391Z",
     "start_time": "2019-11-13T07:12:48.442905Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(162501, 9)"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用多项式交叉特征\n",
    "\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "poly = PolynomialFeatures(degree=2, include_bias=False, interaction_only=False)\n",
    "\n",
    "X_poly = poly.fit_transform(X)\n",
    "X_poly.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T07:13:45.224716Z",
     "start_time": "2019-11-13T07:13:45.213748Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x0</th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "      <th>x0^2</th>\n",
       "      <th>x0 x1</th>\n",
       "      <th>x0 x2</th>\n",
       "      <th>x1^2</th>\n",
       "      <th>x1 x2</th>\n",
       "      <th>x2^2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1502.0</td>\n",
       "      <td>2215.0</td>\n",
       "      <td>2153.0</td>\n",
       "      <td>2256004.0</td>\n",
       "      <td>3326930.0</td>\n",
       "      <td>3233806.0</td>\n",
       "      <td>4906225.0</td>\n",
       "      <td>4768895.0</td>\n",
       "      <td>4635409.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1667.0</td>\n",
       "      <td>2072.0</td>\n",
       "      <td>2047.0</td>\n",
       "      <td>2778889.0</td>\n",
       "      <td>3454024.0</td>\n",
       "      <td>3412349.0</td>\n",
       "      <td>4293184.0</td>\n",
       "      <td>4241384.0</td>\n",
       "      <td>4190209.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1611.0</td>\n",
       "      <td>1957.0</td>\n",
       "      <td>1906.0</td>\n",
       "      <td>2595321.0</td>\n",
       "      <td>3152727.0</td>\n",
       "      <td>3070566.0</td>\n",
       "      <td>3829849.0</td>\n",
       "      <td>3730042.0</td>\n",
       "      <td>3632836.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1601.0</td>\n",
       "      <td>1939.0</td>\n",
       "      <td>1831.0</td>\n",
       "      <td>2563201.0</td>\n",
       "      <td>3104339.0</td>\n",
       "      <td>2931431.0</td>\n",
       "      <td>3759721.0</td>\n",
       "      <td>3550309.0</td>\n",
       "      <td>3352561.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1643.0</td>\n",
       "      <td>1965.0</td>\n",
       "      <td>1879.0</td>\n",
       "      <td>2699449.0</td>\n",
       "      <td>3228495.0</td>\n",
       "      <td>3087197.0</td>\n",
       "      <td>3861225.0</td>\n",
       "      <td>3692235.0</td>\n",
       "      <td>3530641.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       x0      x1      x2       x0^2      x0 x1      x0 x2       x1^2  \\\n",
       "0  1502.0  2215.0  2153.0  2256004.0  3326930.0  3233806.0  4906225.0   \n",
       "1  1667.0  2072.0  2047.0  2778889.0  3454024.0  3412349.0  4293184.0   \n",
       "2  1611.0  1957.0  1906.0  2595321.0  3152727.0  3070566.0  3829849.0   \n",
       "3  1601.0  1939.0  1831.0  2563201.0  3104339.0  2931431.0  3759721.0   \n",
       "4  1643.0  1965.0  1879.0  2699449.0  3228495.0  3087197.0  3861225.0   \n",
       "\n",
       "       x1 x2       x2^2  \n",
       "0  4768895.0  4635409.0  \n",
       "1  4241384.0  4190209.0  \n",
       "2  3730042.0  3632836.0  \n",
       "3  3550309.0  3352561.0  \n",
       "4  3692235.0  3530641.0  "
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(X_poly, columns=poly.get_feature_names()).head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T07:14:35.082231Z",
     "start_time": "2019-11-13T07:14:34.862817Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x20481adc470>"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 查看热力图\n",
    "\n",
    "import seaborn as sns\n",
    "\n",
    "sns.heatmap(pd.DataFrame(X_poly, columns=poly.get_feature_names()).corr())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T07:29:42.376567Z",
     "start_time": "2019-11-13T07:24:54.014019Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:652: Warning: The least populated class in y has only 1 members, which is too few. The minimum number of members in any class cannot be less than n_splits=3.\n",
      "  % (min_groups, self.n_splits)), Warning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7211894080651812 {'classify__n_neighbors': 5, 'poly_features__degree': 2, 'poly_features__interaction_only': True}\n"
     ]
    }
   ],
   "source": [
    "# 在 Pipeline 中使用\n",
    "\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "pipe_params = {'poly_features__degree': [1,2,3], \n",
    "              'poly_features__interaction_only': [True, False],\n",
    "              'classify__n_neighbors':[3, 4, 5, 6]}\n",
    "\n",
    "pipe = Pipeline([('poly_features', poly), ('classify', knn)])\n",
    "\n",
    "grid = GridSearchCV(estimator=pipe, param_grid=pipe_params)\n",
    "grid.fit(X, y)\n",
    "\n",
    "print(grid.best_score_, grid.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 文本特征\n",
    "\n",
    "#### 词袋法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:06:31.576085Z",
     "start_time": "2019-11-13T09:06:31.426976Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ItemID</th>\n",
       "      <th>Sentiment</th>\n",
       "      <th>SentimentText</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>is so sad for my APL frie...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>I missed the New Moon trail...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>omg its already 7:30 :O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>.. Omgaga. Im sooo  im gunna CRy. I'...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>i think mi bf is cheating on me!!!   ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ItemID  Sentiment                                      SentimentText\n",
       "0       1          0                       is so sad for my APL frie...\n",
       "1       2          0                     I missed the New Moon trail...\n",
       "2       3          1                            omg its already 7:30 :O\n",
       "3       4          0            .. Omgaga. Im sooo  im gunna CRy. I'...\n",
       "4       5          0           i think mi bf is cheating on me!!!   ..."
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#http://thinknook.com/twitter-sentiment-analysis-training-corpus-dataset-2012-09-22/\n",
    "tweets = pd.read_csv('../data/feature_engineering/twitter_sentiment.csv', encoding='latin1')\n",
    "tweets.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:07:18.531070Z",
     "start_time": "2019-11-13T09:07:18.522586Z"
    }
   },
   "outputs": [],
   "source": [
    "tweets.drop(['ItemID'], axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:07:25.835728Z",
     "start_time": "2019-11-13T09:07:25.829745Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Sentiment</th>\n",
       "      <th>SentimentText</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>is so sad for my APL frie...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>I missed the New Moon trail...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>omg its already 7:30 :O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>.. Omgaga. Im sooo  im gunna CRy. I'...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>i think mi bf is cheating on me!!!   ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Sentiment                                      SentimentText\n",
       "0          0                       is so sad for my APL frie...\n",
       "1          0                     I missed the New Moon trail...\n",
       "2          1                            omg its already 7:30 :O\n",
       "3          0            .. Omgaga. Im sooo  im gunna CRy. I'...\n",
       "4          0           i think mi bf is cheating on me!!!   ..."
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tweets.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:07:28.554405Z",
     "start_time": "2019-11-13T09:07:28.550381Z"
    }
   },
   "outputs": [],
   "source": [
    "X = tweets['SentimentText']\n",
    "y = tweets['Sentiment']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:07:30.881359Z",
     "start_time": "2019-11-13T09:07:29.744637Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(99989, 105545)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "\n",
    "vect = CountVectorizer(stop_words='english')  # removes a set of english stop words (if, a, the, etc)\n",
    "_ = vect.fit_transform(X)\n",
    "print(_.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:07:37.304218Z",
     "start_time": "2019-11-13T09:07:37.298235Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "frozenset({'a',\n",
       "           'about',\n",
       "           'above',\n",
       "           'across',\n",
       "           'after',\n",
       "           'afterwards',\n",
       "           'again',\n",
       "           'against',\n",
       "           'all',\n",
       "           'almost',\n",
       "           'alone',\n",
       "           'along',\n",
       "           'already',\n",
       "           'also',\n",
       "           'although',\n",
       "           'always',\n",
       "           'am',\n",
       "           'among',\n",
       "           'amongst',\n",
       "           'amoungst',\n",
       "           'amount',\n",
       "           'an',\n",
       "           'and',\n",
       "           'another',\n",
       "           'any',\n",
       "           'anyhow',\n",
       "           'anyone',\n",
       "           'anything',\n",
       "           'anyway',\n",
       "           'anywhere',\n",
       "           'are',\n",
       "           'around',\n",
       "           'as',\n",
       "           'at',\n",
       "           'back',\n",
       "           'be',\n",
       "           'became',\n",
       "           'because',\n",
       "           'become',\n",
       "           'becomes',\n",
       "           'becoming',\n",
       "           'been',\n",
       "           'before',\n",
       "           'beforehand',\n",
       "           'behind',\n",
       "           'being',\n",
       "           'below',\n",
       "           'beside',\n",
       "           'besides',\n",
       "           'between',\n",
       "           'beyond',\n",
       "           'bill',\n",
       "           'both',\n",
       "           'bottom',\n",
       "           'but',\n",
       "           'by',\n",
       "           'call',\n",
       "           'can',\n",
       "           'cannot',\n",
       "           'cant',\n",
       "           'co',\n",
       "           'con',\n",
       "           'could',\n",
       "           'couldnt',\n",
       "           'cry',\n",
       "           'de',\n",
       "           'describe',\n",
       "           'detail',\n",
       "           'do',\n",
       "           'done',\n",
       "           'down',\n",
       "           'due',\n",
       "           'during',\n",
       "           'each',\n",
       "           'eg',\n",
       "           'eight',\n",
       "           'either',\n",
       "           'eleven',\n",
       "           'else',\n",
       "           'elsewhere',\n",
       "           'empty',\n",
       "           'enough',\n",
       "           'etc',\n",
       "           'even',\n",
       "           'ever',\n",
       "           'every',\n",
       "           'everyone',\n",
       "           'everything',\n",
       "           'everywhere',\n",
       "           'except',\n",
       "           'few',\n",
       "           'fifteen',\n",
       "           'fifty',\n",
       "           'fill',\n",
       "           'find',\n",
       "           'fire',\n",
       "           'first',\n",
       "           'five',\n",
       "           'for',\n",
       "           'former',\n",
       "           'formerly',\n",
       "           'forty',\n",
       "           'found',\n",
       "           'four',\n",
       "           'from',\n",
       "           'front',\n",
       "           'full',\n",
       "           'further',\n",
       "           'get',\n",
       "           'give',\n",
       "           'go',\n",
       "           'had',\n",
       "           'has',\n",
       "           'hasnt',\n",
       "           'have',\n",
       "           'he',\n",
       "           'hence',\n",
       "           'her',\n",
       "           'here',\n",
       "           'hereafter',\n",
       "           'hereby',\n",
       "           'herein',\n",
       "           'hereupon',\n",
       "           'hers',\n",
       "           'herself',\n",
       "           'him',\n",
       "           'himself',\n",
       "           'his',\n",
       "           'how',\n",
       "           'however',\n",
       "           'hundred',\n",
       "           'i',\n",
       "           'ie',\n",
       "           'if',\n",
       "           'in',\n",
       "           'inc',\n",
       "           'indeed',\n",
       "           'interest',\n",
       "           'into',\n",
       "           'is',\n",
       "           'it',\n",
       "           'its',\n",
       "           'itself',\n",
       "           'keep',\n",
       "           'last',\n",
       "           'latter',\n",
       "           'latterly',\n",
       "           'least',\n",
       "           'less',\n",
       "           'ltd',\n",
       "           'made',\n",
       "           'many',\n",
       "           'may',\n",
       "           'me',\n",
       "           'meanwhile',\n",
       "           'might',\n",
       "           'mill',\n",
       "           'mine',\n",
       "           'more',\n",
       "           'moreover',\n",
       "           'most',\n",
       "           'mostly',\n",
       "           'move',\n",
       "           'much',\n",
       "           'must',\n",
       "           'my',\n",
       "           'myself',\n",
       "           'name',\n",
       "           'namely',\n",
       "           'neither',\n",
       "           'never',\n",
       "           'nevertheless',\n",
       "           'next',\n",
       "           'nine',\n",
       "           'no',\n",
       "           'nobody',\n",
       "           'none',\n",
       "           'noone',\n",
       "           'nor',\n",
       "           'not',\n",
       "           'nothing',\n",
       "           'now',\n",
       "           'nowhere',\n",
       "           'of',\n",
       "           'off',\n",
       "           'often',\n",
       "           'on',\n",
       "           'once',\n",
       "           'one',\n",
       "           'only',\n",
       "           'onto',\n",
       "           'or',\n",
       "           'other',\n",
       "           'others',\n",
       "           'otherwise',\n",
       "           'our',\n",
       "           'ours',\n",
       "           'ourselves',\n",
       "           'out',\n",
       "           'over',\n",
       "           'own',\n",
       "           'part',\n",
       "           'per',\n",
       "           'perhaps',\n",
       "           'please',\n",
       "           'put',\n",
       "           'rather',\n",
       "           're',\n",
       "           'same',\n",
       "           'see',\n",
       "           'seem',\n",
       "           'seemed',\n",
       "           'seeming',\n",
       "           'seems',\n",
       "           'serious',\n",
       "           'several',\n",
       "           'she',\n",
       "           'should',\n",
       "           'show',\n",
       "           'side',\n",
       "           'since',\n",
       "           'sincere',\n",
       "           'six',\n",
       "           'sixty',\n",
       "           'so',\n",
       "           'some',\n",
       "           'somehow',\n",
       "           'someone',\n",
       "           'something',\n",
       "           'sometime',\n",
       "           'sometimes',\n",
       "           'somewhere',\n",
       "           'still',\n",
       "           'such',\n",
       "           'system',\n",
       "           'take',\n",
       "           'ten',\n",
       "           'than',\n",
       "           'that',\n",
       "           'the',\n",
       "           'their',\n",
       "           'them',\n",
       "           'themselves',\n",
       "           'then',\n",
       "           'thence',\n",
       "           'there',\n",
       "           'thereafter',\n",
       "           'thereby',\n",
       "           'therefore',\n",
       "           'therein',\n",
       "           'thereupon',\n",
       "           'these',\n",
       "           'they',\n",
       "           'thick',\n",
       "           'thin',\n",
       "           'third',\n",
       "           'this',\n",
       "           'those',\n",
       "           'though',\n",
       "           'three',\n",
       "           'through',\n",
       "           'throughout',\n",
       "           'thru',\n",
       "           'thus',\n",
       "           'to',\n",
       "           'together',\n",
       "           'too',\n",
       "           'top',\n",
       "           'toward',\n",
       "           'towards',\n",
       "           'twelve',\n",
       "           'twenty',\n",
       "           'two',\n",
       "           'un',\n",
       "           'under',\n",
       "           'until',\n",
       "           'up',\n",
       "           'upon',\n",
       "           'us',\n",
       "           'very',\n",
       "           'via',\n",
       "           'was',\n",
       "           'we',\n",
       "           'well',\n",
       "           'were',\n",
       "           'what',\n",
       "           'whatever',\n",
       "           'when',\n",
       "           'whence',\n",
       "           'whenever',\n",
       "           'where',\n",
       "           'whereafter',\n",
       "           'whereas',\n",
       "           'whereby',\n",
       "           'wherein',\n",
       "           'whereupon',\n",
       "           'wherever',\n",
       "           'whether',\n",
       "           'which',\n",
       "           'while',\n",
       "           'whither',\n",
       "           'who',\n",
       "           'whoever',\n",
       "           'whole',\n",
       "           'whom',\n",
       "           'whose',\n",
       "           'why',\n",
       "           'will',\n",
       "           'with',\n",
       "           'within',\n",
       "           'without',\n",
       "           'would',\n",
       "           'yet',\n",
       "           'you',\n",
       "           'your',\n",
       "           'yours',\n",
       "           'yourself',\n",
       "           'yourselves'})"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vect.get_stop_words()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:08:18.575110Z",
     "start_time": "2019-11-13T09:08:04.816272Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(99989, 3219557)\n"
     ]
    }
   ],
   "source": [
    "vect = CountVectorizer(ngram_range=(1, 5))  # also includes phrases up to 5 words\n",
    "_ = vect.fit_transform(X)\n",
    "print(_.shape)  # explodes the number of feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:08:23.475096Z",
     "start_time": "2019-11-13T09:08:20.764012Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['00',\n",
       " '00 01',\n",
       " '00 01 minute',\n",
       " '00 01 minute after',\n",
       " '00 01 minute after applications',\n",
       " '00 10',\n",
       " '00 10 00',\n",
       " '00 56',\n",
       " '00 56 03',\n",
       " '00 56 03 beating',\n",
       " '00 56 03 beating my',\n",
       " '00 always',\n",
       " '00 always have',\n",
       " '00 always have such',\n",
       " '00 always have such warmth']"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vect.get_feature_names()[:15]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### TF-IDF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:11:43.035789Z",
     "start_time": "2019-11-13T09:11:40.589556Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(99989, 105849) 6.613194267305311e-05\n",
      "(99989, 105849) 2.1863060975751186e-05\n"
     ]
    }
   ],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "\n",
    "vect = CountVectorizer()\n",
    "_ = vect.fit_transform(X)\n",
    "print(_.shape, _[0, :].mean())\n",
    "\n",
    "vect = TfidfVectorizer()\n",
    "_ = vect.fit_transform(X)\n",
    "print(_.shape, _[0, :].mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:12:10.080987Z",
     "start_time": "2019-11-13T09:12:10.073009Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    0.564632\n",
       "0    0.435368\n",
       "Name: Sentiment, dtype: float64"
      ]
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.value_counts(normalize=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:17:38.257227Z",
     "start_time": "2019-11-13T09:16:28.356847Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7557531328446129 {'vect__max_features': 10000, 'vect__ngram_range': (1, 2), 'vect__stop_words': None}\n"
     ]
    }
   ],
   "source": [
    "# 特征很多，样本也多，使用朴素贝叶斯快速计算\n",
    "\n",
    "from sklearn.naive_bayes import MultinomialNB\n",
    "\n",
    "pipe_params = {'vect__ngram_range': [(1,1), (1,2)], \n",
    "               'vect__max_features': [1000, 10000],\n",
    "              'vect__stop_words':[None, 'english']}\n",
    "\n",
    "pipe = Pipeline([('vect', CountVectorizer()),('classify', MultinomialNB())])\n",
    "grid = GridSearchCV(pipe, param_grid=pipe_params)\n",
    "\n",
    "grid.fit(X,y)\n",
    "\n",
    "print(grid.best_score_, grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-13T09:37:33.123647Z",
     "start_time": "2019-11-13T09:19:03.420139Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7584334276770445 {'featurizer__count_vect__max_features': 10000, 'featurizer__count_vect__ngram_range': (1, 2), 'featurizer__count_vect__stop_words': None, 'featurizer__tfidf_vect__max_features': 10000, 'featurizer__tfidf_vect__ngram_range': (1, 1), 'featurizer__tfidf_vect__stop_words': 'english'}\n"
     ]
    }
   ],
   "source": [
    "# 合并特征\n",
    "from sklearn.pipeline import FeatureUnion\n",
    "\n",
    "featurizer = FeatureUnion([('tfidf_vect', TfidfVectorizer()), ('count_vect', CountVectorizer())])\n",
    "_ = featurizer.fit_transform(X)\n",
    "pipe_params = {'featurizer__count_vect__ngram_range':[(1, 1), (1, 2)], 'featurizer__count_vect__max_features':[1000, 10000], 'featurizer__count_vect__stop_words':[None, 'english'],\n",
    "              'featurizer__tfidf_vect__ngram_range':[(1, 1), (1, 2)], 'featurizer__tfidf_vect__max_features':[1000, 10000], 'featurizer__tfidf_vect__stop_words':[None, 'english']}\n",
    "\n",
    "\n",
    "pipe = Pipeline([('featurizer', featurizer), ('classify', MultinomialNB())])\n",
    "\n",
    "grid = GridSearchCV(pipe, pipe_params)\n",
    "grid.fit(X, y)\n",
    "\n",
    "print(grid.best_score_, grid.best_params_)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征选择"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T07:49:22.874861Z",
     "start_time": "2019-11-20T07:49:22.871933Z"
    }
   },
   "outputs": [],
   "source": [
    "# 设定随机种子，让每次的随机数一样\n",
    "np.random.seed(123)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T07:49:51.653217Z",
     "start_time": "2019-11-20T07:49:51.535091Z"
    }
   },
   "outputs": [],
   "source": [
    "# https://archive.ics.uci.edu/ml/datasets/default+of+credit+card+clients\n",
    "# 信用卡逾期数据集\n",
    "credit_card_default = pd.read_csv('../data/feature_engineering//credit_card_default.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T07:49:57.790107Z",
     "start_time": "2019-11-20T07:49:57.775463Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>LIMIT_BAL</th>\n",
       "      <th>SEX</th>\n",
       "      <th>EDUCATION</th>\n",
       "      <th>MARRIAGE</th>\n",
       "      <th>AGE</th>\n",
       "      <th>PAY_0</th>\n",
       "      <th>PAY_2</th>\n",
       "      <th>PAY_3</th>\n",
       "      <th>PAY_4</th>\n",
       "      <th>PAY_5</th>\n",
       "      <th>...</th>\n",
       "      <th>BILL_AMT4</th>\n",
       "      <th>BILL_AMT5</th>\n",
       "      <th>BILL_AMT6</th>\n",
       "      <th>PAY_AMT1</th>\n",
       "      <th>PAY_AMT2</th>\n",
       "      <th>PAY_AMT3</th>\n",
       "      <th>PAY_AMT4</th>\n",
       "      <th>PAY_AMT5</th>\n",
       "      <th>PAY_AMT6</th>\n",
       "      <th>default payment next month</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20000</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>24</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>689</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>120000</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>26</td>\n",
       "      <td>-1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3272</td>\n",
       "      <td>3455</td>\n",
       "      <td>3261</td>\n",
       "      <td>0</td>\n",
       "      <td>1000</td>\n",
       "      <td>1000</td>\n",
       "      <td>1000</td>\n",
       "      <td>0</td>\n",
       "      <td>2000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>90000</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>34</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>14331</td>\n",
       "      <td>14948</td>\n",
       "      <td>15549</td>\n",
       "      <td>1518</td>\n",
       "      <td>1500</td>\n",
       "      <td>1000</td>\n",
       "      <td>1000</td>\n",
       "      <td>1000</td>\n",
       "      <td>5000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>50000</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>37</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>28314</td>\n",
       "      <td>28959</td>\n",
       "      <td>29547</td>\n",
       "      <td>2000</td>\n",
       "      <td>2019</td>\n",
       "      <td>1200</td>\n",
       "      <td>1100</td>\n",
       "      <td>1069</td>\n",
       "      <td>1000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>50000</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>57</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>20940</td>\n",
       "      <td>19146</td>\n",
       "      <td>19131</td>\n",
       "      <td>2000</td>\n",
       "      <td>36681</td>\n",
       "      <td>10000</td>\n",
       "      <td>9000</td>\n",
       "      <td>689</td>\n",
       "      <td>679</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   LIMIT_BAL  SEX  EDUCATION  MARRIAGE  AGE  PAY_0  PAY_2  PAY_3  PAY_4  \\\n",
       "0      20000    2          2         1   24      2      2     -1     -1   \n",
       "1     120000    2          2         2   26     -1      2      0      0   \n",
       "2      90000    2          2         2   34      0      0      0      0   \n",
       "3      50000    2          2         1   37      0      0      0      0   \n",
       "4      50000    1          2         1   57     -1      0     -1      0   \n",
       "\n",
       "   PAY_5  ...  BILL_AMT4  BILL_AMT5  BILL_AMT6  PAY_AMT1  PAY_AMT2  PAY_AMT3  \\\n",
       "0     -2  ...          0          0          0         0       689         0   \n",
       "1      0  ...       3272       3455       3261         0      1000      1000   \n",
       "2      0  ...      14331      14948      15549      1518      1500      1000   \n",
       "3      0  ...      28314      28959      29547      2000      2019      1200   \n",
       "4      0  ...      20940      19146      19131      2000     36681     10000   \n",
       "\n",
       "   PAY_AMT4  PAY_AMT5  PAY_AMT6  default payment next month  \n",
       "0         0         0         0                           1  \n",
       "1      1000         0      2000                           1  \n",
       "2      1000      1000      5000                           0  \n",
       "3      1100      1069      1000                           0  \n",
       "4      9000       689       679                           0  \n",
       "\n",
       "[5 rows x 24 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_card_default.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T07:50:06.822337Z",
     "start_time": "2019-11-20T07:50:06.818433Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(30000, 24)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_card_default.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T07:50:15.494180Z",
     "start_time": "2019-11-20T07:50:15.417044Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>min</th>\n",
       "      <th>25%</th>\n",
       "      <th>50%</th>\n",
       "      <th>75%</th>\n",
       "      <th>max</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>LIMIT_BAL</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>167484.322667</td>\n",
       "      <td>129747.661567</td>\n",
       "      <td>10000.0</td>\n",
       "      <td>50000.00</td>\n",
       "      <td>140000.0</td>\n",
       "      <td>240000.00</td>\n",
       "      <td>1000000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SEX</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>1.603733</td>\n",
       "      <td>0.489129</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.00</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>EDUCATION</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>1.853133</td>\n",
       "      <td>0.790349</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.00</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MARRIAGE</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>1.551867</td>\n",
       "      <td>0.521970</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.00</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AGE</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>35.485500</td>\n",
       "      <td>9.217904</td>\n",
       "      <td>21.0</td>\n",
       "      <td>28.00</td>\n",
       "      <td>34.0</td>\n",
       "      <td>41.00</td>\n",
       "      <td>79.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_0</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>-0.016700</td>\n",
       "      <td>1.123802</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>-1.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_2</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>-0.133767</td>\n",
       "      <td>1.197186</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>-1.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_3</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>-0.166200</td>\n",
       "      <td>1.196868</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>-1.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_4</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>-0.220667</td>\n",
       "      <td>1.169139</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>-1.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_5</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>-0.266200</td>\n",
       "      <td>1.133187</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>-1.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_6</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>-0.291100</td>\n",
       "      <td>1.149988</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>-1.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BILL_AMT1</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>51223.330900</td>\n",
       "      <td>73635.860576</td>\n",
       "      <td>-165580.0</td>\n",
       "      <td>3558.75</td>\n",
       "      <td>22381.5</td>\n",
       "      <td>67091.00</td>\n",
       "      <td>964511.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BILL_AMT2</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>49179.075167</td>\n",
       "      <td>71173.768783</td>\n",
       "      <td>-69777.0</td>\n",
       "      <td>2984.75</td>\n",
       "      <td>21200.0</td>\n",
       "      <td>64006.25</td>\n",
       "      <td>983931.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BILL_AMT3</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>47013.154800</td>\n",
       "      <td>69349.387427</td>\n",
       "      <td>-157264.0</td>\n",
       "      <td>2666.25</td>\n",
       "      <td>20088.5</td>\n",
       "      <td>60164.75</td>\n",
       "      <td>1664089.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BILL_AMT4</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>43262.948967</td>\n",
       "      <td>64332.856134</td>\n",
       "      <td>-170000.0</td>\n",
       "      <td>2326.75</td>\n",
       "      <td>19052.0</td>\n",
       "      <td>54506.00</td>\n",
       "      <td>891586.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BILL_AMT5</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>40311.400967</td>\n",
       "      <td>60797.155770</td>\n",
       "      <td>-81334.0</td>\n",
       "      <td>1763.00</td>\n",
       "      <td>18104.5</td>\n",
       "      <td>50190.50</td>\n",
       "      <td>927171.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BILL_AMT6</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>38871.760400</td>\n",
       "      <td>59554.107537</td>\n",
       "      <td>-339603.0</td>\n",
       "      <td>1256.00</td>\n",
       "      <td>17071.0</td>\n",
       "      <td>49198.25</td>\n",
       "      <td>961664.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_AMT1</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>5663.580500</td>\n",
       "      <td>16563.280354</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1000.00</td>\n",
       "      <td>2100.0</td>\n",
       "      <td>5006.00</td>\n",
       "      <td>873552.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_AMT2</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>5921.163500</td>\n",
       "      <td>23040.870402</td>\n",
       "      <td>0.0</td>\n",
       "      <td>833.00</td>\n",
       "      <td>2009.0</td>\n",
       "      <td>5000.00</td>\n",
       "      <td>1684259.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_AMT3</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>5225.681500</td>\n",
       "      <td>17606.961470</td>\n",
       "      <td>0.0</td>\n",
       "      <td>390.00</td>\n",
       "      <td>1800.0</td>\n",
       "      <td>4505.00</td>\n",
       "      <td>896040.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_AMT4</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>4826.076867</td>\n",
       "      <td>15666.159744</td>\n",
       "      <td>0.0</td>\n",
       "      <td>296.00</td>\n",
       "      <td>1500.0</td>\n",
       "      <td>4013.25</td>\n",
       "      <td>621000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_AMT5</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>4799.387633</td>\n",
       "      <td>15278.305679</td>\n",
       "      <td>0.0</td>\n",
       "      <td>252.50</td>\n",
       "      <td>1500.0</td>\n",
       "      <td>4031.50</td>\n",
       "      <td>426529.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PAY_AMT6</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>5215.502567</td>\n",
       "      <td>17777.465775</td>\n",
       "      <td>0.0</td>\n",
       "      <td>117.75</td>\n",
       "      <td>1500.0</td>\n",
       "      <td>4000.00</td>\n",
       "      <td>528666.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>default payment next month</th>\n",
       "      <td>30000.0</td>\n",
       "      <td>0.221200</td>\n",
       "      <td>0.415062</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.00</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                              count           mean            std       min  \\\n",
       "LIMIT_BAL                   30000.0  167484.322667  129747.661567   10000.0   \n",
       "SEX                         30000.0       1.603733       0.489129       1.0   \n",
       "EDUCATION                   30000.0       1.853133       0.790349       0.0   \n",
       "MARRIAGE                    30000.0       1.551867       0.521970       0.0   \n",
       "AGE                         30000.0      35.485500       9.217904      21.0   \n",
       "PAY_0                       30000.0      -0.016700       1.123802      -2.0   \n",
       "PAY_2                       30000.0      -0.133767       1.197186      -2.0   \n",
       "PAY_3                       30000.0      -0.166200       1.196868      -2.0   \n",
       "PAY_4                       30000.0      -0.220667       1.169139      -2.0   \n",
       "PAY_5                       30000.0      -0.266200       1.133187      -2.0   \n",
       "PAY_6                       30000.0      -0.291100       1.149988      -2.0   \n",
       "BILL_AMT1                   30000.0   51223.330900   73635.860576 -165580.0   \n",
       "BILL_AMT2                   30000.0   49179.075167   71173.768783  -69777.0   \n",
       "BILL_AMT3                   30000.0   47013.154800   69349.387427 -157264.0   \n",
       "BILL_AMT4                   30000.0   43262.948967   64332.856134 -170000.0   \n",
       "BILL_AMT5                   30000.0   40311.400967   60797.155770  -81334.0   \n",
       "BILL_AMT6                   30000.0   38871.760400   59554.107537 -339603.0   \n",
       "PAY_AMT1                    30000.0    5663.580500   16563.280354       0.0   \n",
       "PAY_AMT2                    30000.0    5921.163500   23040.870402       0.0   \n",
       "PAY_AMT3                    30000.0    5225.681500   17606.961470       0.0   \n",
       "PAY_AMT4                    30000.0    4826.076867   15666.159744       0.0   \n",
       "PAY_AMT5                    30000.0    4799.387633   15278.305679       0.0   \n",
       "PAY_AMT6                    30000.0    5215.502567   17777.465775       0.0   \n",
       "default payment next month  30000.0       0.221200       0.415062       0.0   \n",
       "\n",
       "                                 25%       50%        75%        max  \n",
       "LIMIT_BAL                   50000.00  140000.0  240000.00  1000000.0  \n",
       "SEX                             1.00       2.0       2.00        2.0  \n",
       "EDUCATION                       1.00       2.0       2.00        6.0  \n",
       "MARRIAGE                        1.00       2.0       2.00        3.0  \n",
       "AGE                            28.00      34.0      41.00       79.0  \n",
       "PAY_0                          -1.00       0.0       0.00        8.0  \n",
       "PAY_2                          -1.00       0.0       0.00        8.0  \n",
       "PAY_3                          -1.00       0.0       0.00        8.0  \n",
       "PAY_4                          -1.00       0.0       0.00        8.0  \n",
       "PAY_5                          -1.00       0.0       0.00        8.0  \n",
       "PAY_6                          -1.00       0.0       0.00        8.0  \n",
       "BILL_AMT1                    3558.75   22381.5   67091.00   964511.0  \n",
       "BILL_AMT2                    2984.75   21200.0   64006.25   983931.0  \n",
       "BILL_AMT3                    2666.25   20088.5   60164.75  1664089.0  \n",
       "BILL_AMT4                    2326.75   19052.0   54506.00   891586.0  \n",
       "BILL_AMT5                    1763.00   18104.5   50190.50   927171.0  \n",
       "BILL_AMT6                    1256.00   17071.0   49198.25   961664.0  \n",
       "PAY_AMT1                     1000.00    2100.0    5006.00   873552.0  \n",
       "PAY_AMT2                      833.00    2009.0    5000.00  1684259.0  \n",
       "PAY_AMT3                      390.00    1800.0    4505.00   896040.0  \n",
       "PAY_AMT4                      296.00    1500.0    4013.25   621000.0  \n",
       "PAY_AMT5                      252.50    1500.0    4031.50   426529.0  \n",
       "PAY_AMT6                      117.75    1500.0    4000.00   528666.0  \n",
       "default payment next month      0.00       0.0       0.00        1.0  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_card_default.describe().T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T07:50:35.278405Z",
     "start_time": "2019-11-20T07:50:35.267134Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LIMIT_BAL                     0\n",
       "SEX                           0\n",
       "EDUCATION                     0\n",
       "MARRIAGE                      0\n",
       "AGE                           0\n",
       "PAY_0                         0\n",
       "PAY_2                         0\n",
       "PAY_3                         0\n",
       "PAY_4                         0\n",
       "PAY_5                         0\n",
       "PAY_6                         0\n",
       "BILL_AMT1                     0\n",
       "BILL_AMT2                     0\n",
       "BILL_AMT3                     0\n",
       "BILL_AMT4                     0\n",
       "BILL_AMT5                     0\n",
       "BILL_AMT6                     0\n",
       "PAY_AMT1                      0\n",
       "PAY_AMT2                      0\n",
       "PAY_AMT3                      0\n",
       "PAY_AMT4                      0\n",
       "PAY_AMT5                      0\n",
       "PAY_AMT6                      0\n",
       "default payment next month    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_card_default.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T07:52:42.575191Z",
     "start_time": "2019-11-20T07:52:42.552713Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.7788\n",
       "1    0.2212\n",
       "Name: default payment next month, dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = credit_card_default.drop(['default payment next month'], axis=1)\n",
    "y = credit_card_default['default payment next month']\n",
    "# 空准确率\n",
    "y.value_counts(normalize=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "建立一个方法，使用网格搜索获取最优模型和评价结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T11:16:00.101978Z",
     "start_time": "2019-11-20T11:16:00.097126Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "def get_best_model_and_accuracy(model, params, X, y):\n",
    "    grid = GridSearchCV(estimator=model, \n",
    "                        param_grid=params, \n",
    "                        error_score=0.)# if a parameter set raises an error, continue and set the performance as a big, fat 0\n",
    "    grid.fit(X, y)\n",
    "    \n",
    "    # 最佳准确率\n",
    "    print(\"Best Accuracy: {}\".format(grid.best_score_))\n",
    "    # 最佳模型参数\n",
    "    print(\"Best parameters: {}\".format(grid.best_params_))\n",
    "    # 平均训练时间\n",
    "    print(\"Average Time to Fit (s): {}\".format(round(grid.cv_results_['mean_fit_time'].mean(), 3)))\n",
    "    # 平均预测时间\n",
    "    print(\"Average Time to Score (s): {}\".format(round(grid.cv_results_['mean_score_time'].mean(), 3)))\n",
    "    return grid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T11:14:30.032377Z",
     "start_time": "2019-11-20T11:14:30.026521Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "lr_params = {'C': [1e-1, 1e0, 1e1, 1e2], 'penalty': ['l1', 'l2']}\n",
    "knn_params = {'n_neighbors': [1, 3, 5, 7]}\n",
    "tree_params = {'max_depth': [None, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]}\n",
    "forest_params = {'n_estimators': [10, 50, 100], 'max_depth': [None, 1, 3, 5, 7]}\n",
    "\n",
    "lr = LogisticRegression()\n",
    "knn = KNeighborsClassifier()\n",
    "d_tree = DecisionTreeClassifier()\n",
    "forest = RandomForestClassifier()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T11:16:14.567980Z",
     "start_time": "2019-11-20T11:16:03.305921Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best Accuracy: 0.8095\n",
      "Best parameters: {'C': 0.1, 'penalty': 'l1'}\n",
      "Average Time to Fit (s): 0.44\n",
      "Average Time to Score (s): 0.002\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv='warn', error_score=0.0,\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='warn',\n",
       "          tol=0.0001, verbose=0, warm_start=False),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'C': [0.1, 1.0, 10.0, 100.0], 'penalty': ['l1', 'l2']},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_best_model_and_accuracy(lr, lr_params, X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:36:38.863520Z",
     "start_time": "2019-11-20T08:36:15.260973Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best Accuracy: 0.7602333333333333\n",
      "Best parameters: {'n_neighbors': 7}\n",
      "Average Time to Fit (s)\n",
      "Average Time to Score (s)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv='warn', error_score=0.0,\n",
       "       estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n",
       "           weights='uniform'),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'n_neighbors': [1, 3, 5, 7]}, pre_dispatch='2*n_jobs',\n",
       "       refit=True, return_train_score='warn', scoring=None, verbose=0)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_best_model_and_accuracy(knn, knn_params, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 皮尔逊相关系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:38:17.434518Z",
     "start_time": "2019-11-20T08:38:17.197501Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x286883fd208>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns \n",
    "\n",
    "sns.heatmap(credit_card_default.corr())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:38:24.269186Z",
     "start_time": "2019-11-20T08:38:24.232097Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LIMIT_BAL                    -0.153520\n",
       "SEX                          -0.039961\n",
       "EDUCATION                     0.028006\n",
       "MARRIAGE                     -0.024339\n",
       "AGE                           0.013890\n",
       "PAY_0                         0.324794\n",
       "PAY_2                         0.263551\n",
       "PAY_3                         0.235253\n",
       "PAY_4                         0.216614\n",
       "PAY_5                         0.204149\n",
       "PAY_6                         0.186866\n",
       "BILL_AMT1                    -0.019644\n",
       "BILL_AMT2                    -0.014193\n",
       "BILL_AMT3                    -0.014076\n",
       "BILL_AMT4                    -0.010156\n",
       "BILL_AMT5                    -0.006760\n",
       "BILL_AMT6                    -0.005372\n",
       "PAY_AMT1                     -0.072929\n",
       "PAY_AMT2                     -0.058579\n",
       "PAY_AMT3                     -0.056250\n",
       "PAY_AMT4                     -0.056827\n",
       "PAY_AMT5                     -0.055124\n",
       "PAY_AMT6                     -0.053183\n",
       "default payment next month    1.000000\n",
       "Name: default payment next month, dtype: float64"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_card_default.corr()['default payment next month']  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "选取一定阈值的特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:39:09.724225Z",
     "start_time": "2019-11-20T08:39:09.685185Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LIMIT_BAL                     False\n",
       "SEX                           False\n",
       "EDUCATION                     False\n",
       "MARRIAGE                      False\n",
       "AGE                           False\n",
       "PAY_0                          True\n",
       "PAY_2                          True\n",
       "PAY_3                          True\n",
       "PAY_4                          True\n",
       "PAY_5                          True\n",
       "PAY_6                         False\n",
       "BILL_AMT1                     False\n",
       "BILL_AMT2                     False\n",
       "BILL_AMT3                     False\n",
       "BILL_AMT4                     False\n",
       "BILL_AMT5                     False\n",
       "BILL_AMT6                     False\n",
       "PAY_AMT1                      False\n",
       "PAY_AMT2                      False\n",
       "PAY_AMT3                      False\n",
       "PAY_AMT4                      False\n",
       "PAY_AMT5                      False\n",
       "PAY_AMT6                      False\n",
       "default payment next month     True\n",
       "Name: default payment next month, dtype: bool"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "credit_card_default.corr()['default payment next month'].abs() > 0.2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "自定义转换器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T09:00:28.266906Z",
     "start_time": "2019-11-20T09:00:28.261014Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.base import TransformerMixin, BaseEstimator\n",
    "\n",
    "class CustomCorrelationChooser(TransformerMixin, BaseEstimator):\n",
    "    def __init__(self, response, cols_to_keep=[], threshold=None):\n",
    "        # 目标列\n",
    "        self.response = response\n",
    "        # 阈值\n",
    "        self.threshold = threshold\n",
    "        # 需要保留的列\n",
    "        self.cols_to_keep = cols_to_keep\n",
    "        \n",
    "    def transform(self, X):\n",
    "        return X[self.cols_to_keep]\n",
    "    \n",
    "    def fit(self, X, *_):\n",
    "        df = pd.concat([X, self.response], axis=1)\n",
    "        self.cols_to_keep = df.columns[df.corr()[df.columns[-1]].abs() > self.threshold]\n",
    "        self.cols_to_keep = [c for c in self.cols_to_keep if c in X.columns]\n",
    "        return self"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:47:12.000942Z",
     "start_time": "2019-11-20T08:47:11.997973Z"
    }
   },
   "outputs": [],
   "source": [
    "ccc = CustomCorrelationChooser(threshold=.2, response=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:47:16.246562Z",
     "start_time": "2019-11-20T08:47:16.197225Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['PAY_0', 'PAY_2', 'PAY_3', 'PAY_4', 'PAY_5']"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ccc.fit(X)\n",
    "\n",
    "ccc.cols_to_keep"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:47:21.832392Z",
     "start_time": "2019-11-20T08:47:21.823576Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PAY_0</th>\n",
       "      <th>PAY_2</th>\n",
       "      <th>PAY_3</th>\n",
       "      <th>PAY_4</th>\n",
       "      <th>PAY_5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>-2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PAY_0  PAY_2  PAY_3  PAY_4  PAY_5\n",
       "0      2      2     -1     -1     -2\n",
       "1     -1      2      0      0      0\n",
       "2      0      0      0      0      0\n",
       "3      0      0      0      0      0\n",
       "4     -1      0     -1      0      0"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ccc.transform(X).head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T08:57:24.260414Z",
     "start_time": "2019-11-20T08:57:24.256479Z"
    }
   },
   "outputs": [],
   "source": [
    "tree_pipe_params = {'classifier__max_depth': \n",
    "                    [None, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T09:00:46.072319Z",
     "start_time": "2019-11-20T09:00:30.328032Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'classifier__max_depth': [None, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21], 'correlation_select__threshold': [0, 0.1, 0.2, 0.3]}\n",
      "Best Accuracy: 0.8206\n",
      "Best parameters: {'classifier__max_depth': 5, 'correlation_select__threshold': 0.1}\n",
      "Average Time to Fit (s)\n",
      "Average Time to Score (s)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv='warn', error_score=0.0,\n",
       "       estimator=Pipeline(memory=None,\n",
       "     steps=[('correlation_select', CustomCorrelationChooser(cols_to_keep=[],\n",
       "             response=0        1\n",
       "1        1\n",
       "2        0\n",
       "3        0\n",
       "4        0\n",
       "5        0\n",
       "6        0\n",
       "7        0\n",
       "8        0\n",
       "9        0\n",
       "10       0\n",
       "11       0\n",
       "12       0\n",
       "13       1\n",
       "14       0\n",
       "15       0\n",
       "16       1\n",
       "17       0\n",
       "18      ...      min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n",
       "            splitter='best'))]),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'classifier__max_depth': [None, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21], 'correlation_select__threshold': [0, 0.1, 0.2, 0.3]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from copy import deepcopy\n",
    "from sklearn.pipeline import Pipeline\n",
    "ccc = CustomCorrelationChooser(response=y)\n",
    "ccc_pipe = Pipeline([('correlation_select', ccc), \n",
    "                     ('classifier', d_tree)])\n",
    "# 拷贝参数字典\n",
    "ccc_pipe_params = deepcopy(tree_pipe_params)\n",
    "# 更新参数字典\n",
    "ccc_pipe_params.update({\n",
    "               'correlation_select__threshold':[0, .1, .2, .3]})\n",
    "print(ccc_pipe_params)\n",
    "\n",
    "get_best_model_and_accuracy(ccc_pipe, ccc_pipe_params, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 假设检验 SelectKBest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T09:13:58.443406Z",
     "start_time": "2019-11-20T09:13:58.419982Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>column</th>\n",
       "      <th>p_value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>PAY_0</td>\n",
       "      <td>0.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>PAY_2</td>\n",
       "      <td>0.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>PAY_3</td>\n",
       "      <td>0.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>PAY_4</td>\n",
       "      <td>1.899297e-315</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>PAY_5</td>\n",
       "      <td>1.126608e-279</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>PAY_6</td>\n",
       "      <td>7.296740e-234</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>LIMIT_BAL</td>\n",
       "      <td>1.302244e-157</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>PAY_AMT1</td>\n",
       "      <td>1.146488e-36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>PAY_AMT2</td>\n",
       "      <td>3.166657e-24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>PAY_AMT4</td>\n",
       "      <td>6.830942e-23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>PAY_AMT3</td>\n",
       "      <td>1.841770e-22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>PAY_AMT5</td>\n",
       "      <td>1.241345e-21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>PAY_AMT6</td>\n",
       "      <td>3.033589e-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>SEX</td>\n",
       "      <td>4.395249e-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>EDUCATION</td>\n",
       "      <td>1.225038e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>MARRIAGE</td>\n",
       "      <td>2.485364e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>BILL_AMT1</td>\n",
       "      <td>6.673295e-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>BILL_AMT2</td>\n",
       "      <td>1.395736e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>BILL_AMT3</td>\n",
       "      <td>1.476998e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>AGE</td>\n",
       "      <td>1.613685e-02</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       column        p_value\n",
       "5       PAY_0   0.000000e+00\n",
       "6       PAY_2   0.000000e+00\n",
       "7       PAY_3   0.000000e+00\n",
       "8       PAY_4  1.899297e-315\n",
       "9       PAY_5  1.126608e-279\n",
       "10      PAY_6  7.296740e-234\n",
       "0   LIMIT_BAL  1.302244e-157\n",
       "17   PAY_AMT1   1.146488e-36\n",
       "18   PAY_AMT2   3.166657e-24\n",
       "20   PAY_AMT4   6.830942e-23\n",
       "19   PAY_AMT3   1.841770e-22\n",
       "21   PAY_AMT5   1.241345e-21\n",
       "22   PAY_AMT6   3.033589e-20\n",
       "1         SEX   4.395249e-12\n",
       "2   EDUCATION   1.225038e-06\n",
       "3    MARRIAGE   2.485364e-05\n",
       "11  BILL_AMT1   6.673295e-04\n",
       "12  BILL_AMT2   1.395736e-02\n",
       "13  BILL_AMT3   1.476998e-02\n",
       "4         AGE   1.613685e-02"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.feature_selection import SelectKBest\n",
    "# This models a statistical test known as ANOVA\n",
    "from sklearn.feature_selection import f_classif\n",
    "\n",
    "k_best = SelectKBest(f_classif, k=5)\n",
    "k_best.fit_transform(X, y )\n",
    "\n",
    "p_values = pd.DataFrame({'column': X.columns, 'p_value': k_best.pvalues_}).sort_values('p_value')\n",
    "p_values[p_values['p_value'] < .05]                                                                                      "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 基于模型的特征选择"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:08:58.259771Z",
     "start_time": "2019-11-20T10:08:58.063375Z"
    }
   },
   "outputs": [],
   "source": [
    "# 使用文本数据\n",
    "tweets = pd.read_csv('../data/feature_engineering//twitter_sentiment.csv', \n",
    "                     encoding='latin1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:09:07.743673Z",
     "start_time": "2019-11-20T10:09:07.737782Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ItemID</th>\n",
       "      <th>Sentiment</th>\n",
       "      <th>SentimentText</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>is so sad for my APL frie...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>I missed the New Moon trail...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>omg its already 7:30 :O</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>.. Omgaga. Im sooo  im gunna CRy. I'...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>i think mi bf is cheating on me!!!   ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ItemID  Sentiment                                      SentimentText\n",
       "0       1          0                       is so sad for my APL frie...\n",
       "1       2          0                     I missed the New Moon trail...\n",
       "2       3          1                            omg its already 7:30 :O\n",
       "3       4          0            .. Omgaga. Im sooo  im gunna CRy. I'...\n",
       "4       5          0           i think mi bf is cheating on me!!!   ..."
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tweets.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:09:12.977226Z",
     "start_time": "2019-11-20T10:09:12.973323Z"
    }
   },
   "outputs": [],
   "source": [
    "tweets_X, tweets_y = tweets['SentimentText'], tweets['Sentiment']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:09:16.528951Z",
     "start_time": "2019-11-20T10:09:16.521144Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    0.564632\n",
       "0    0.435368\n",
       "Name: Sentiment, dtype: float64"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# null accuracy\n",
    "tweets_y.value_counts(normalize=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 树模型特征选择"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:11:16.453199Z",
     "start_time": "2019-11-20T10:11:15.940700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>importance</th>\n",
       "      <th>feature</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.161425</td>\n",
       "      <td>PAY_0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.073898</td>\n",
       "      <td>AGE</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>0.070728</td>\n",
       "      <td>BILL_AMT1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.059788</td>\n",
       "      <td>LIMIT_BAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>0.055184</td>\n",
       "      <td>PAY_AMT3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    importance    feature\n",
       "5     0.161425      PAY_0\n",
       "4     0.073898        AGE\n",
       "11    0.070728  BILL_AMT1\n",
       "0     0.059788  LIMIT_BAL\n",
       "19    0.055184   PAY_AMT3"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree = DecisionTreeClassifier()\n",
    "\n",
    "tree.fit(X, y)\n",
    "\n",
    "importances = pd.DataFrame({'importance': tree.feature_importances_, 'feature':X.columns}).sort_values('importance', ascending=False)\n",
    "\n",
    "importances.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:11:31.874671Z",
     "start_time": "2019-11-20T10:11:31.342741Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.feature_selection import SelectFromModel\n",
    "select_from_model = SelectFromModel(DecisionTreeClassifier(), \n",
    "                                    threshold=.05)\n",
    "selected_X = select_from_model.fit_transform(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:11:33.030512Z",
     "start_time": "2019-11-20T10:11:33.025632Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(30000, 7)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "selected_X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:11:41.026197Z",
     "start_time": "2019-11-20T10:11:41.021316Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'estimator__class_weight': None,\n",
       " 'estimator__criterion': 'gini',\n",
       " 'estimator__max_depth': None,\n",
       " 'estimator__max_features': None,\n",
       " 'estimator__max_leaf_nodes': None,\n",
       " 'estimator__min_impurity_decrease': 0.0,\n",
       " 'estimator__min_impurity_split': None,\n",
       " 'estimator__min_samples_leaf': 1,\n",
       " 'estimator__min_samples_split': 2,\n",
       " 'estimator__min_weight_fraction_leaf': 0.0,\n",
       " 'estimator__presort': False,\n",
       " 'estimator__random_state': None,\n",
       " 'estimator__splitter': 'best',\n",
       " 'estimator': DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
       "             max_features=None, max_leaf_nodes=None,\n",
       "             min_impurity_decrease=0.0, min_impurity_split=None,\n",
       "             min_samples_leaf=1, min_samples_split=2,\n",
       "             min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n",
       "             splitter='best'),\n",
       " 'max_features': None,\n",
       " 'norm_order': 1,\n",
       " 'prefit': False,\n",
       " 'threshold': 0.05}"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "select_from_model.get_params()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T10:13:20.367233Z",
     "start_time": "2019-11-20T10:12:27.333364Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'classifier__max_depth': [1, 3, 5, 7], 'select__threshold': [0.01, 0.05, 0.1, 'mean', 'median', '2.*mean'], 'select__estimator__max_depth': [None, 1, 3, 5, 7]}\n",
      "Best Accuracy: 0.8202666666666667\n",
      "Best parameters: {'classifier__max_depth': 3, 'select__estimator__max_depth': None, 'select__threshold': 0.01}\n",
      "Average Time to Fit (s)\n",
      "Average Time to Score (s)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv='warn', error_score=0.0,\n",
       "       estimator=Pipeline(memory=None,\n",
       "     steps=[('select', SelectFromModel(estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
       "            max_features=None, max_leaf_nodes=None,\n",
       "            min_impurity_decrease=0.0, min_impurity_split=None,\n",
       "            min_samples_leaf=1, min_samples_split=2,\n",
       "           ...      min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n",
       "            splitter='best'))]),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'classifier__max_depth': [1, 3, 5, 7], 'select__threshold': [0.01, 0.05, 0.1, 'mean', 'median', '2.*mean'], 'select__estimator__max_depth': [None, 1, 3, 5, 7]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_pipe_params = {'classifier__max_depth': [1, 3, 5, 7]}\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "select_from_pipe = Pipeline([('select', SelectFromModel(DecisionTreeClassifier())), \n",
    "                             ('classifier', d_tree)])\n",
    "\n",
    "select_from_pipe_params = deepcopy(tree_pipe_params)\n",
    "\n",
    "select_from_pipe_params.update({\n",
    "              'select__threshold': [.01, .05, .1, \"mean\", \"median\", \"2.*mean\"],\n",
    "              'select__estimator__max_depth': [None, 1, 3, 5, 7]\n",
    "              })\n",
    "\n",
    "print(select_from_pipe_params)\n",
    "\n",
    "# not better than original\n",
    "get_best_model_and_accuracy(select_from_pipe, \n",
    "                            select_from_pipe_params, \n",
    "                            X, y)  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 线性模型特征选择\n",
    "\n",
    "通过线性模型参数来进行选择"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T11:17:35.245430Z",
     "start_time": "2019-11-20T11:17:34.923200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>importance</th>\n",
       "      <th>feature</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.577008</td>\n",
       "      <td>PAY_0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.082667</td>\n",
       "      <td>PAY_2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.071973</td>\n",
       "      <td>PAY_3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.033930</td>\n",
       "      <td>PAY_5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.023888</td>\n",
       "      <td>PAY_4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   importance feature\n",
       "5    0.577008   PAY_0\n",
       "6    0.082667   PAY_2\n",
       "7    0.071973   PAY_3\n",
       "9    0.033930   PAY_5\n",
       "8    0.023888   PAY_4"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# l1 正则\n",
    "lr = LogisticRegression(penalty='l1')\n",
    "\n",
    "lr.fit(X, y)\n",
    "\n",
    "importances = pd.DataFrame({'importance': lr.coef_.reshape(-1,), \n",
    "                            'feature':X.columns}).sort_values('importance', ascending=False)\n",
    "\n",
    "importances[importances['importance'] >= .01]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-20T11:17:29.179170Z",
     "start_time": "2019-11-20T11:16:25.073209Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'classifier__max_depth': [1, 3, 5, 7], 'select__threshold': [0.01, 0.05, 0.1, 'mean', 'median', '2.*mean'], 'select__estimator__penalty': ['l1', 'l2']}\n",
      "Best Accuracy: 0.8212\n",
      "Best parameters: {'classifier__max_depth': 5, 'select__estimator__penalty': 'l1', 'select__threshold': 0.01}\n",
      "Average Time to Fit (s): 0.437\n",
      "Average Time to Score (s): 0.001\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv='warn', error_score=0.0,\n",
       "       estimator=Pipeline(memory=None,\n",
       "     steps=[('select', SelectFromModel(estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='warn',\n",
       "          tol=0.0001, verbose=0, warm_start...      min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n",
       "            splitter='best'))]),\n",
       "       fit_params=None, iid='warn', n_jobs=None,\n",
       "       param_grid={'classifier__max_depth': [1, 3, 5, 7], 'select__threshold': [0.01, 0.05, 0.1, 'mean', 'median', '2.*mean'], 'select__estimator__penalty': ['l1', 'l2']},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "logistic_selector = SelectFromModel(LogisticRegression())\n",
    "regularization_pipe = Pipeline([('select', logistic_selector), \n",
    "                                ('classifier', tree)])\n",
    "regularization_pipe_params = deepcopy(tree_pipe_params)\n",
    "\n",
    "regularization_pipe_params.update({\n",
    "              'select__threshold': [.01, .05, .1, \"mean\", \"median\", \"2.*mean\"],\n",
    "              'select__estimator__penalty': ['l1', 'l2'],\n",
    "              })\n",
    "print(regularization_pipe_params)\n",
    "get_best_model_and_accuracy(regularization_pipe, \n",
    "                            regularization_pipe_params, \n",
    "                            X, y) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征学习\n",
    "\n",
    "**特征学习**方法，不依赖参数假设，而是依赖于随机学习，按照迭代轮次学习出最佳特征。特征学习往往使用深度学习算法。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 受限玻尔兹曼机 RBM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T06:53:06.990463Z",
     "start_time": "2019-12-08T06:53:06.984480Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9341341524806636"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import math\n",
    "\n",
    "# sigmoid function\n",
    "def activation(x):\n",
    "    return 1 / (1 + math.exp(-x))\n",
    "\n",
    "inputs = np.array([1, 2, 3, 4])\n",
    "weights = np.array([0.2, 0.324, 0.1, 0.001])\n",
    "bias = 1.5\n",
    "\n",
    "a = activation(np.dot(inputs, weights) + bias)\n",
    "\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:09:27.062365Z",
     "start_time": "2019-12-08T07:09:27.056490Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn import linear_model, datasets, metrics\n",
    "from sklearn.neural_network import BernoulliRBM\n",
    "from sklearn.pipeline import Pipeline\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T06:56:44.857636Z",
     "start_time": "2019-12-08T06:56:41.408364Z"
    }
   },
   "outputs": [],
   "source": [
    "# create numpy array from csv\n",
    "images = np.genfromtxt('../data/feature_engineering/mnist_train.csv', delimiter=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T06:57:01.775171Z",
     "start_time": "2019-12-08T06:57:01.771180Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(6000, 785)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 6000 images and 785 columns, 28X28 pixels + 1 response\n",
    "images.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T06:57:47.365150Z",
     "start_time": "2019-12-08T06:57:47.352185Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0, 255.0)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "images_X, images_y = images[:,1:], images[:,0]\n",
    "np.min(images_X), np.max(images_X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T06:57:59.041008Z",
     "start_time": "2019-12-08T06:57:58.904651Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(images_X[0].reshape(28, 28), cmap=plt.cm.gray_r)\n",
    "\n",
    "images_y[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T06:58:40.940594Z",
     "start_time": "2019-12-08T06:58:40.917629Z"
    }
   },
   "outputs": [],
   "source": [
    "# scale images_X to be beteen 0 and 1\n",
    "images_X = images_X / 255."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T06:58:52.763437Z",
     "start_time": "2019-12-08T06:58:52.731522Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0, 1.0)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# make pixels binary (either white or black)\n",
    "images_X = (images_X > 0.5).astype(float)\n",
    "np.min(images_X), np.max(images_X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T06:58:59.809931Z",
     "start_time": "2019-12-08T06:58:59.716142Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 二值化后，图像的模糊消失了\n",
    "plt.imshow(images_X[0].reshape(28, 28), cmap=plt.cm.gray_r)\n",
    "\n",
    "images_y[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:12:44.232959Z",
     "start_time": "2019-12-08T07:09:58.459542Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "({'clf__C': 1.0, 'rbm__n_components': 200}, 0.9138333333333334)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用 RBM 提取特征，并使用 LR 进行预测\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "rbm = BernoulliRBM(random_state=0)\n",
    "lr = LogisticRegression()\n",
    "\n",
    "params = {'clf__C': [1e-1, 1e0, 1e1],\n",
    "         'rbm__n_components': [100, 200]}\n",
    "\n",
    "# 创建 Pipline\n",
    "pipeline = Pipeline([('rbm', rbm), ('clf', lr)])\n",
    "\n",
    "# 实例化网格化搜索\n",
    "grid = GridSearchCV(pipeline, param_grid=params)\n",
    "grid.fit(images_X, images_y)\n",
    "\n",
    "grid.best_params_, grid.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 词嵌入(embedding) Word2vec\n",
    "\n",
    "词嵌入将词转换为向量，可以应用于词相似计算，信息检索，特征表示等。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:26:56.500257Z",
     "start_time": "2019-12-08T07:26:56.497266Z"
    }
   },
   "outputs": [],
   "source": [
    "# 设置日志，方便查看训练过程\n",
    "import logging\n",
    "logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')\n",
    "\n",
    "import gensim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:21:02.218060Z",
     "start_time": "2019-12-08T07:21:01.939801Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2019-12-08 15:21:02,212 'pattern' package not found; tag filters are not available for English\n"
     ]
    }
   ],
   "source": [
    "from gensim.models import word2vec, Word2Vec\n",
    "\n",
    "sentences = word2vec.Text8Corpus('../data/feature_engineering/text8')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:22:39.684715Z",
     "start_time": "2019-12-08T07:21:51.677176Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2019-12-08 15:21:51,677 collecting all words and their counts\n",
      "2019-12-08 15:21:51,687 PROGRESS: at sentence #0, processed 0 words, keeping 0 word types\n",
      "2019-12-08 15:21:55,607 collected 253854 word types from a corpus of 17005207 raw words and 1701 sentences\n",
      "2019-12-08 15:21:55,607 Loading a fresh vocabulary\n",
      "2019-12-08 15:21:56,110 min_count=1 retains 253854 unique words (100% of original 253854, drops 0)\n",
      "2019-12-08 15:21:56,111 min_count=1 leaves 17005207 word corpus (100% of original 17005207, drops 0)\n",
      "2019-12-08 15:21:56,732 deleting the raw counts dictionary of 253854 items\n",
      "2019-12-08 15:21:56,736 sample=0.001 downsamples 36 most-common words\n",
      "2019-12-08 15:21:56,736 downsampling leaves estimated 12819131 word corpus (75.4% of prior 17005207)\n",
      "2019-12-08 15:21:57,262 estimated required memory for 253854 words and 20 dimensions: 167543640 bytes\n",
      "2019-12-08 15:21:57,262 resetting layer weights\n",
      "2019-12-08 15:21:59,279 training model with 3 workers on 253854 vocabulary and 20 features, using sg=0 hs=0 sample=0.001 negative=5 window=5\n",
      "2019-12-08 15:22:00,285 EPOCH 1 - PROGRESS: at 12.29% examples, 1562295 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:01,287 EPOCH 1 - PROGRESS: at 24.63% examples, 1569956 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:02,293 EPOCH 1 - PROGRESS: at 36.51% examples, 1557260 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:03,300 EPOCH 1 - PROGRESS: at 48.74% examples, 1558601 words/s, in_qsize 6, out_qsize 1\n",
      "2019-12-08 15:22:04,303 EPOCH 1 - PROGRESS: at 61.49% examples, 1574583 words/s, in_qsize 6, out_qsize 0\n",
      "2019-12-08 15:22:05,306 EPOCH 1 - PROGRESS: at 73.90% examples, 1577007 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:06,309 EPOCH 1 - PROGRESS: at 86.36% examples, 1576616 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:07,312 EPOCH 1 - PROGRESS: at 98.94% examples, 1579922 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:07,394 worker thread finished; awaiting finish of 2 more threads\n",
      "2019-12-08 15:22:07,399 worker thread finished; awaiting finish of 1 more threads\n",
      "2019-12-08 15:22:07,401 worker thread finished; awaiting finish of 0 more threads\n",
      "2019-12-08 15:22:07,401 EPOCH - 1 : training on 17005207 raw words (12819932 effective words) took 8.1s, 1578926 effective words/s\n",
      "2019-12-08 15:22:08,405 EPOCH 2 - PROGRESS: at 12.40% examples, 1579998 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:09,411 EPOCH 2 - PROGRESS: at 25.28% examples, 1611072 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:10,412 EPOCH 2 - PROGRESS: at 38.04% examples, 1624227 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:11,419 EPOCH 2 - PROGRESS: at 50.62% examples, 1620425 words/s, in_qsize 6, out_qsize 0\n",
      "2019-12-08 15:22:12,420 EPOCH 2 - PROGRESS: at 63.14% examples, 1618151 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:13,422 EPOCH 2 - PROGRESS: at 75.25% examples, 1606251 words/s, in_qsize 6, out_qsize 0\n",
      "2019-12-08 15:22:14,426 EPOCH 2 - PROGRESS: at 87.30% examples, 1595017 words/s, in_qsize 4, out_qsize 0\n",
      "2019-12-08 15:22:15,427 EPOCH 2 - PROGRESS: at 99.41% examples, 1588806 words/s, in_qsize 6, out_qsize 0\n",
      "2019-12-08 15:22:15,461 worker thread finished; awaiting finish of 2 more threads\n",
      "2019-12-08 15:22:15,461 worker thread finished; awaiting finish of 1 more threads\n",
      "2019-12-08 15:22:15,464 worker thread finished; awaiting finish of 0 more threads\n",
      "2019-12-08 15:22:15,465 EPOCH - 2 : training on 17005207 raw words (12819089 effective words) took 8.1s, 1590104 effective words/s\n",
      "2019-12-08 15:22:16,473 EPOCH 3 - PROGRESS: at 12.29% examples, 1559038 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:17,476 EPOCH 3 - PROGRESS: at 24.63% examples, 1567826 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:18,482 EPOCH 3 - PROGRESS: at 36.68% examples, 1562923 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:19,485 EPOCH 3 - PROGRESS: at 48.97% examples, 1566906 words/s, in_qsize 6, out_qsize 0\n",
      "2019-12-08 15:22:20,488 EPOCH 3 - PROGRESS: at 61.08% examples, 1564894 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:21,491 EPOCH 3 - PROGRESS: at 73.19% examples, 1562306 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:22,492 EPOCH 3 - PROGRESS: at 85.36% examples, 1559111 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:23,492 EPOCH 3 - PROGRESS: at 97.47% examples, 1557842 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:23,682 worker thread finished; awaiting finish of 2 more threads\n",
      "2019-12-08 15:22:23,684 worker thread finished; awaiting finish of 1 more threads\n",
      "2019-12-08 15:22:23,687 worker thread finished; awaiting finish of 0 more threads\n",
      "2019-12-08 15:22:23,687 EPOCH - 3 : training on 17005207 raw words (12821212 effective words) took 8.2s, 1559866 effective words/s\n",
      "2019-12-08 15:22:24,693 EPOCH 4 - PROGRESS: at 12.23% examples, 1552767 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:25,696 EPOCH 4 - PROGRESS: at 24.81% examples, 1580129 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:26,702 EPOCH 4 - PROGRESS: at 36.98% examples, 1575787 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:27,705 EPOCH 4 - PROGRESS: at 49.44% examples, 1581457 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:28,706 EPOCH 4 - PROGRESS: at 61.61% examples, 1578866 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:29,708 EPOCH 4 - PROGRESS: at 74.43% examples, 1589211 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:30,710 EPOCH 4 - PROGRESS: at 86.95% examples, 1588473 words/s, in_qsize 6, out_qsize 0\n",
      "2019-12-08 15:22:31,711 EPOCH 4 - PROGRESS: at 99.82% examples, 1595570 words/s, in_qsize 3, out_qsize 0\n",
      "2019-12-08 15:22:31,712 worker thread finished; awaiting finish of 2 more threads\n",
      "2019-12-08 15:22:31,717 worker thread finished; awaiting finish of 1 more threads\n",
      "2019-12-08 15:22:31,718 worker thread finished; awaiting finish of 0 more threads\n",
      "2019-12-08 15:22:31,718 EPOCH - 4 : training on 17005207 raw words (12818593 effective words) took 8.0s, 1596541 effective words/s\n",
      "2019-12-08 15:22:32,727 EPOCH 5 - PROGRESS: at 12.76% examples, 1616296 words/s, in_qsize 6, out_qsize 0\n",
      "2019-12-08 15:22:33,730 EPOCH 5 - PROGRESS: at 25.28% examples, 1608986 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:34,731 EPOCH 5 - PROGRESS: at 37.62% examples, 1604375 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:35,733 EPOCH 5 - PROGRESS: at 50.32% examples, 1611440 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:36,735 EPOCH 5 - PROGRESS: at 63.14% examples, 1618660 words/s, in_qsize 5, out_qsize 0\n",
      "2019-12-08 15:22:37,736 EPOCH 5 - PROGRESS: at 75.49% examples, 1611707 words/s, in_qsize 4, out_qsize 1\n",
      "2019-12-08 15:22:38,740 EPOCH 5 - PROGRESS: at 87.95% examples, 1607550 words/s, in_qsize 6, out_qsize 0\n",
      "2019-12-08 15:22:39,676 worker thread finished; awaiting finish of 2 more threads\n",
      "2019-12-08 15:22:39,677 worker thread finished; awaiting finish of 1 more threads\n",
      "2019-12-08 15:22:39,680 worker thread finished; awaiting finish of 0 more threads\n",
      "2019-12-08 15:22:39,681 EPOCH - 5 : training on 17005207 raw words (12820187 effective words) took 8.0s, 1610551 effective words/s\n",
      "2019-12-08 15:22:39,681 training on a 85026035 raw words (64099013 effective words) took 40.4s, 1586620 effective words/s\n"
     ]
    }
   ],
   "source": [
    "# instantiate a gensim module on the sentences from above\n",
    "# min_count allows us to ignore words that occur strictly less than this value\n",
    "# size is the dimension of words we wish to learn\n",
    "model = Word2Vec(sentences, min_count=1, size=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:23:53.000104Z",
     "start_time": "2019-12-08T07:23:52.996142Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-2.0125573 ,  0.2544487 ,  5.076512  ,  2.641983  , -1.4323539 ,\n",
       "       -3.1821811 , -2.5331855 , -3.0314212 ,  1.0664788 , -2.329465  ,\n",
       "        3.3908658 , -3.341876  ,  4.5301423 , -0.52069855,  0.48848453,\n",
       "       -1.2554439 ,  7.6860123 , -5.3749785 , -2.8794553 , -0.398532  ],\n",
       "      dtype=float32)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看单词的 embedding\n",
    "model.wv['king']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:43:41.885746Z",
     "start_time": "2019-12-08T07:43:05.000850Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2019-12-08 15:43:05,001 loading projection weights from ../data/feature_engineering/GoogleNews-vectors-negative300.bin\n",
      "2019-12-08 15:43:41,836 loaded (3000000, 300) matrix from ../data/feature_engineering/GoogleNews-vectors-negative300.bin\n"
     ]
    }
   ],
   "source": [
    "# 导入预训练词库\n",
    "# 此数据下载地址： https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz\n",
    "model = gensim.models.KeyedVectors.load_word2vec_format('../data/feature_engineering/GoogleNews-vectors-negative300.bin', binary=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:44:52.015763Z",
     "start_time": "2019-12-08T07:44:30.173000Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2019-12-08 15:44:30,173 precomputing L2-norms of word weight vectors\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[('queen', 0.7118192911148071)]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 女 + 国王 - 男 = 女王\n",
    "model.wv.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:45:04.949806Z",
     "start_time": "2019-12-08T07:45:04.749825Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('France', 0.667637825012207)]"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# London is to England as Paris is to ____\n",
    "model.wv.most_similar(positive=['Paris', 'England'], negative=['London'], topn=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "信息检索应用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:45:14.905889Z",
     "start_time": "2019-12-08T07:45:14.901383Z"
    }
   },
   "outputs": [],
   "source": [
    "# helper function to try to grab embeddings for a word and returns None if that word is not found\n",
    "def get_embedding(string):\n",
    "    try:\n",
    "        return model.wv[string]\n",
    "    except:\n",
    "        return None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:45:16.239803Z",
     "start_time": "2019-12-08T07:45:16.236812Z"
    }
   },
   "outputs": [],
   "source": [
    "sentences = [\n",
    "    \"this is about a dog\",\n",
    "    \"this is about a cat\",\n",
    "    \"this is about nothing\"\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:48:24.580744Z",
     "start_time": "2019-12-08T07:48:24.573761Z"
    }
   },
   "outputs": [],
   "source": [
    "from functools import reduce\n",
    "# Zero matrix of shape (3,300)\n",
    "vectorized_sentences = np.zeros((len(sentences),300))\n",
    "# for every sentence\n",
    "for i, sentence in enumerate(sentences):\n",
    "    # tokenize sentence into words\n",
    "    words = sentence.split(' ')\n",
    "    # embed whichever words that we can\n",
    "    embedded_words = [get_embedding(w) for w in words]\n",
    "    embedded_words = list(filter(lambda x:x is not None, embedded_words))\n",
    "    # Take a mean of the vectors, to get an estimate vectorization of the entire title\n",
    "    vectorized_sentence = reduce(lambda x,y:x+y, embedded_words)/ len(embedded_words)\n",
    "    # change the ith row (in place) to be the ith vectorization\n",
    "    vectorized_sentences[i:] = vectorized_sentence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:48:34.882410Z",
     "start_time": "2019-12-08T07:48:34.878422Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 300)"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vectorized_sentences.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-12-08T07:48:41.314489Z",
     "start_time": "2019-12-08T07:48:41.307479Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'this is about a dog'"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# we want articles most similar to the reference word \"dog\"\n",
    "reference_word = 'dog'\n",
    "\n",
    "# take a dot product between the embedding of dof and our vectorized matrix\n",
    "best_sentence_idx = np.dot(vectorized_sentences, get_embedding(reference_word)).argsort()[-1]\n",
    "\n",
    "# output the most relevant sentence\n",
    "sentences[best_sentence_idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
